Spring的事务传播机制

七种事务传播机制

多个事务方法相互调用时,事务如何在这些方法之间进行传播,Spring中提供了七种不同的传播机制,来保证事务的正常执行:

  • REQUIRED:默认的传播机制,如果存在事务,则支持/加入当前事务,如果当前没有事务,则新建一个事务(适用于修改场景)
  • SUPPORTS:如果存在事务,则支持当前事务,如果当前没有事务,则以非事务的方式执行(适用于只读场景)
  • MANDATORY(强制的):如果存在事务,则支持当前事务,如果当前没有事务,则抛出异常
  • REQUIRED_NEW:如果存在事务,则挂起当前事务,如果当前没有事务,则新建一个事务
  • NOT_SUPPORTED:如果存在事务,则挂起当前事务,否则以非事务的方式运行
  • NEVER:如果存在事务,则抛出异常,否则以非事务的方式运行
  • NESTED:如果存在事务,则开启嵌套事务运行,嵌套的事务可以独立于当前事务进行单独的提交或者回滚,否则新建一个事务

支持事务

将子方法的逻辑添加到主方法的事务中,由主方法的事务进行控制

事务挂起

新建事务时,将现有的Connection1保存到ThreadLocal中(它还有尚未提交的事务),然后创建Connection2,Connection2提交、回滚、关闭完毕后,再把Connection1取出来,完成提交、回滚、关闭等动作,保存Connection1的动作称之为事务挂起
Connection

REQUIRED_NEW和NESTED的区别
  • REQUIRED_NEW是新开一个事务且该事务与原事务无关,而NESTED是当前存在事务时会开启一个嵌套事务
  • REQUIRED_NEW原事务回滚不会影响新开的事务,NESTED父事务回滚,子事务也会回滚
REQUIRED_NEW和NESTED的共同点

新事务回滚都不会影响原事务

REQUIRED和NESTED的区别

REQUIRED情况下,主方法存在事务时,子方法和主方法使用的是同一个事务,所以子方法出现异常,无论主方法是否catch,事务都会回滚;NESTED情况下,子方法出现异常,如果主方法catch其异常,那么只有子事务回滚,父事务不会回滚

REQUIRED和NESTED的共同点

主方法回滚,子方法会都会跟着回滚

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值