zoukankan      html  css  js  c++  java
  • 详细解析Spring事务的配置和OpenSessionInview的作用

    1.事务的特性
      原子性:事务中的操作是不可分割的一部分
      一致性:要么同时成功,要么同时失败(事务执行前后数据保持一致)
      隔离性:并发互不干扰  
      持久性:事务一旦被提交,它就是一条持久性的数据
      
     2.Spring事务管理高层抽象3个接口
        PlatformTransactionManager--平台事务管理器
          -Spring为不同的持久化框架提供了不同的平台事务管理器接口实现
        TransactionDefinition--事务定义信息(隔离,传播,超时,只读)
          1>事务的隔离级别
            default--适用后端数据库默认的隔离级别
            READ_UNCOMMITED - READ_COMMITTED - REPEATABLE_READ - SERIALIZABLE(脏,幻(虚),不可重复读)
          2>事务的传播行为:解决业务层方法之间相互调用的问题
            PROPAGATION_REQUIRED - 支持当前事务,如果不存在就新建一个
            PROPAGATION_REQUIRES_NEW - 如果有事务存在,挂起当前事务,创建一个新的事物
            PROPAGATION_NESTED - 如果当前事务存在,则嵌套执行
        TransactionStatus--事务具体运行状态
          1>------------------------------------------------------
        流程 --
            根据事务定义的信息有平台事务管理器进行事务管理,进行管理产生相应的状态
     
    3.Spring事务管理
      - 编程式的事务管理 -- 通过TransactionTemplate(事务模板)
      - 使用xml配置声明式事务
        --基于transactionProxyFactoryBean的事务管理
          ---配置事务管理器
          ---配置业务层代理
          ---配置目标对象
          ---注入事务管理器
          ---注入事务
          <!--
    prop格式 PROPAGATION--事务的传播行为 ISOLATION--事务的隔离级别        READONLY--只读
    -EXCEPTION--发生哪些行为事务回滚 +EXCEPTION--发生哪些错误事务不回滚
    -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置业务层代理 -->
    <bean id="accountServiceProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 配置目标对象 -->
    <property name="target" ref="accountService"></property>
    <!-- 注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager"></property>
    <!-- 注入事务属性 -->
    <property name="transactionAttribute">
    <props>

    <prop key="tran*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>

    --基于AspectJ的事务声明(重点)
        ---配置事务的增强
          ----事务定义信息
            -----propagation:事务的传播行为
            -----isolation:事务的隔离级别
            -----read-only:只读
            -----rollback-for:发生哪些异常时回滚
            -----no-rollback-for:发生哪些异常时不回滚
            -----timeout:过期信息
         ---配置切面
          ----配置切入点
          ----配置切面
          <!-- 配置事务的通知(事务的增强) -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <!-- 事务定义信息 -->
    <tx:attributes>
    <tx:method name="tran*" propagation="REQUIRED" read-only="false" />
    </tx:attributes>
    </tx:advice>
    <!-- 配置切面 -->
    <aop:config>
    <!-- 配置切入点 -->
    <aop:pointcut expression="execution(* com.spring.service.impl.*.*(..))"
    id="pointcut" />
    <!-- 配置切面 -->
    <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pointcut" />
    </aop:config>
      
      --基于注解的方式进行事务的声明(重点)
        ---开启事务注解
            <tx:annotation-driven transaction-manager="transactionManager"/>
        ---在要进行实务操作的类名上进行注解

           @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)

    hibernate中为了性能,一般采用代理加载,所以实现多表连接,外键表字段会因为session的关闭无法查询到,

    这时候就需要在web.xml中配置opensessioninview -- 在页面中打开session

     <filter>
            <filter-name>OpenSessionInView</filter-name>
            <filter-class>
                org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
           </filter>
         <filter-mapping>
      <filter-name>OpenSessionInView</filter-name>
      <url-pattern>/*</url-pattern>
      </filter-mapping>

    此时如果在页面上对数据进行写入操作(增加,删除,修改等),会出现read-only错误.这个错误可以配置事务解决


    http://blog.csdn.net/jacxuan/article/details/53454819

  • 相关阅读:
    安装xcache3.0.3/3.2,为php加速
    编译安装lamp环境
    使用rpm包安装lamp环境
    centos6下通用二进制安装mysql5.5.33
    centos中进程管理工具
    centos6下的lvm逻辑卷的管理
    centos6中创建软raid方法
    解决vmware虚拟机克隆后启动centos报错device eth0 does not seem to be present, delaying initialization
    centos下常用文件管理命令
    centos下httpd-2.4的编译安装
  • 原文地址:https://www.cnblogs.com/qwop/p/6637317.html
Copyright © 2011-2022 走看看