详细解析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

原文地址:https://www.cnblogs.com/qwop/p/6637317.html