spring事务学习总结

来源:互联网 发布:烟台华商网络怎么样 编辑:程序博客网 时间:2024/04/30 01:46

spring事务 

1.主要有三个接口:PlatformTransactionManager(全局事务管理器)、TransactionDefinition(事务配置相关,如隔离、只读、传播、超时、异常回滚等)、TransactionStatus(有查询事务状态的相关方法,如isNewTransaction、isRollBackOnly等)。

2.Spring事务的隔离级别
 1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.hibernate默认为REPEATABLE_READ、oracle默认为READ_COMMITTED;
      另外四个与JDBC的隔离级别相对应
 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
      这种隔离级别会产生脏读,不可重复读和幻像读。
 3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
      它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
 5. ISOLATION_SERIALIZABLE(串行化,事务只能排队进行,不能并行) 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
      除了防止脏读,不可重复读外,还避免了幻像读。

3.spring事务的传播级别Propagation :

有以下选项可供使用(标红为常用):

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--支持当前事务,创建新事务,方法在嵌套事务里执行;无当前事务,创建新事务并和REQUIRED相同。

4.实现spring事物有两种方式:编程式和声明式

(1)编程式

    编程式可以在业务逻辑类上注入xml中配置的TransactionTemplate类;在业务逻辑类中调用TransactionTemplate.execute(new TransactionCallbackWithoutResult(){ });

把需要控制的事物内容放进去即可;

(2)声明式

     1.TransactionProxyFactoryBean代理类配置事物代理bean,一般不推荐,只能一一对应。

     2.xml中配置aop。

       

 <tx:advice id="txAdvice" transaction-manager="transactionManager">       <tx:attributes>          <!-- 所有以get开头的方法都是只读的 -->          <tx:method name="get*" read-only="true"/>          <!-- 其他方法使用默认的事务设置,超时5s -->          <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="-1"/>       </tx:attributes>    </tx:advice>    <!-- 配置aop元素 -->    <aop:config>        <aop:pointcut expression="execution(* com.service.Imp.*Imp.*(..))" id="myPointcut"/>        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>    </aop:config>
   3.注解方式配置@Transactional,优点方便,缺点是每个业务类都要配一遍。

PS:<tx:attributes>中还可以包含rollback-for:发生哪些异常进行回滚;no-rollback:发生哪些异常不进行回滚;timeout:超时时长,默认为-1;read-only:只读;

1 0