Spring 的不同事务传播行为

目录

Spring 的不同事务传播行为

PROPAGATION_REQUIRES_NEW事务传播行为什么情况下会使用?

一、PROPAGATION_REQUIRES_NEW的含义

二、使用场景

三、注意事项

PROPAGATION_NESTED事务传播行为什么情况下会使用?

一、PROPAGATION_NESTED的含义

二、使用场景

三、嵌套事务的特点

四、注意事项


Spring 的不同事务传播行为

  • 事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
1 @Transactional(propagation = Propagation.REQUIRES_NEW)
2 public void methodB() {
  • PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
  • PROPAGATION SUPPORTS:如果存在一个事务,支持当前事务各。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器 。PROPAGATION_SUPPORTS与不使用事务有少许不同。
  • PROPAGATION_MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
  • PROPAGATION_REQUIRES_NEW:需要使用JTATransactionManager作为事务管理器,它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。
  •  PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并并挂起任何存在的事务。也需要使用JTATransactionManager作为事务管理器
  • PROPAGATION_NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常。
  • PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行,

【PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW的区别】:它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启个新的事务。

  • 使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独工立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA事务管理器的支持。
  • 使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED时,需要JDBC3.0以上驱动及1.4以上的JDK版本支持。其它的JTATrasactionManager实现可能有不同的支持方式。
  • PROPAGATION REQUIRES NEW 启动一个新的,不依赖于环境的勺"内部"事务。这个事务将被完全commited或rolled back而不依赖于外部事务,它拥有自己的隔离范围,自己的锁等等。当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。另一方面i, PROPAGATION NESTED 开始一个"嵌套的"事务,它是已经存在事务的一个真正的子事务。嵌套事务开始执行时,它将取得一个savepoint。如果这个嵌套事务失败,我们将回滚到此savepoint。嵌套事务是外部事务的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值