`
JavaSam
  • 浏览: 934830 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring如何实现事务的传播特性

 
阅读更多

所谓事务传播特性就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7中事务传播行为

1.PROPAGATION_REQUIRED(默认实现):当前没有事务则新建事务,有则加入当前事务

2.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务则以非事务方式执行

3PROPAGATION_MANDATORY:使用当前事务,如果没有则抛出异常

4PROPAGATION__REQUIRES_NEW:新建事务,如果当前有事务则把当前事务挂起

5PROPAGATION_NOT_SUPPORIED:以非事务的方式执行,如果当前有事务则把当前事务挂起

6PROPAGATION_NEVER:以非事务的方式执行,如果当前有事务则抛出异常

7PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行1

为什么Spring可以让事务进行传播呢:看了源码我们就明白了

-----由于Spring的事务管理是通过线程相关的ThreadLocal来保存数据访问基础设施的(Connection对象),再结合IoC和AOP实现高级声明式事务的功能,所以Spring的事务天然的和线程有着千丝万缕的关系。

      Spring通过ThreadLocal可以将大部分Bean无状态化(线程安全的)所以Spring中单实例Bean对线程安全问题拥有一种天然的免疫力。

       所以Spring中DAO和Service都以单实例的方式存在,Spring将有状态的变量(Connection)本地线程化,达到另一个层面上的线程无关,从而实现线程无关。

 

 

       总结:在相同的线程中进行相互嵌套调用的事务方法工作于相同的事务中,不同的线程中,则各自独立工作与独立的事务中。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics