spring事务传播总结

事务传播机制

  • 场景:serviceA.methodA调用serviceB.methodB,A和B方法本 身都已经被添加了事务控制,那么A调用B的时候,就需要进行事务的一些协商
  • 传播级别是针对serviceB.methodB设置,serviceA.methodA保持默认即可,如果对A设置不当(SUPPORTS)当前事务还会失效,继而影响B的事务。
  • 同一个service中的方法互相调用,被调用方法事务不生效。
  • spring事务是通过代理对象对方法增强来管理事务的,同一个service中通过一个方法调用另外一个方法,是通过目标对象this引用调用的,目标对象自身并没有事务管理功能。此时被调用的方法事务不起作用,设置传播级别更没有意义。

事务传播级别

REQUIRED
  • 支持当前事务,如果当前没有事务,则新建事务
  • 如果当前存在事务,则加入事务,合并成一个事务
\B有事务B无事务
A有事务A或B异常,A和B都回滚A或B异常,A和B都回滚
A无事务A异常,A和B都不回滚,B异常 A不回滚,B回滚A或B异常,A和B都不回滚
SUPPORTS
  • 如果当前存在事务,则加入事务
  • 如果当前不存在事务,则以非事务方式进行
\B有事务B无事务
A有事务A或B异常,A和B都回滚A或B异常,A和B都回滚
A无事务A或B异常,A和B都不回滚A或B异常,A和B都不回滚
MANDATORY
  • 如果当前存在事务,则运行在当前事务中
  • 如果当前无事务,则抛异常,也即父级方法必须有事务
\B有事务B无事务
A有事务A或B异常,A和B都回滚A或B异常,A和B都回滚
A无事务抛异常抛异常
REQUIRES_NEW
  • 新建事务,如果当前存在事务,则把当前事务挂起
  • 这个方法会独立提交事务,不受调用者(父方法)的事务影响,即使父方法异常,他也能正常提交
\B有事务B无事务
A有事务A异常:A回滚,B不回滚,B异常:A和B都回滚A或B异常,A和B都回滚
A无事务A异常:A和B都不回滚,B异常 :A不回滚,B回滚A或B异常,A和B都不回滚
NOT_SUPPORTS
  • 以非事务方式进行
  • 如果当前存在事务 ,则把当前事务挂起,
\B有事务B无事务
A有事务A或B异常:A都回滚,B都不回滚A或B异常,A和B都回滚
A无事务A或B异常,A和B都不回滚A或B异常,A和B都不回滚
NEVER
  • 以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务 ,很少使用
\B有事务B无事务
A有事务抛异常抛异常
A无事务A或B异常,A和B都不回滚A或B异常,A和B都不回滚
NESTED
  • 如果当前存在事务,它将会成为父级的一个子事务,方法结束后并没有提交,只是等待父事务结束才提交
  • 如果当前没有事务,则新建事务
  • 如果它本身异常,父级可以捕获到它的异常,而不进行回滚。正常提交
  • 但是如果父级异常,它必然回滚这就是和上面REQUIRES_NEW的区别
\B有事务B无事务
A有事务A或B异常,A和B都回滚A或B异常,A和B都回滚
A无事务A异常:A和B都不回滚,B异常 :A不回滚,B回滚A或B异常,A和B都不回滚
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值