spring事务传播机制

事务传播(propagation)机制

  1. required :支持当前事务,请求事务,没有就新建一个

  2. supports: 支持当前事务,有木有都可以,有就支持当前事务

  3. mandatory: 支持当前事务,强制要求有事务,否则抛异常

  4. requires_new : 不支持当前事务,会将当前事务挂起,新建一个事务,

  5. not_supported:不支持当前事务,在无事务状态下运行。

  6. never:不支持当前事务,有就抛异常

  7. nested: 如果当前事务存在,则执行的代码作为子事务嵌套在当前事务中执行:

    外层事务提交,嵌套子事务才提交,外层事务异常回滚,嵌套的子事务也无法提交,会回滚;

    嵌套的子事务会在执行时,保存一个savepoint,子事务提交失败,会回滚到savepoint点,如果外层事务调用子事务方法没有捕获异常,那么外层事务也将回滚,捕获异常,则不会回滚。

int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;

事务的嵌套

这里只描述常见的一种嵌套类型

外层内层事务情况
requiredrequired如果程序正常执行,那么内层事务不会提交,在外部事务中统一进行事务提交。
如果内层事务,或者外层事务中出现异常情况,那么会在外层事务的处理中统一进行异常回滚。
注意:当内层事务方法抛异常时,即使外层事务捕获了内层事务方法异常,最后提交依然会回滚,因为事务是同一个,而内层方法抛异常时已经标记该事务为回滚状态
supports
mandatory
never外层方法不能出现事务,如果出现事务则直接报错
not_supported外层方法中有事务,直接挂起,内层方法没有异常情况的话直接顺利执行。
如果内层方法有异常的话,那么内层方法中已经执行的数据库操作不会触发回滚, 而外层方法如果没有捕获异常,外层事务也会会进行回滚操作。
如果外层方法中出现了异常, 那么内部方法是不会回滚的,只有外层事务才会回滚
required_new如果外层方法中存在事务,内层方法在运行的时候会挂起外层事务并开启一个新的事务,外层事务不影响 内层事务。
如果程序正常执行,则内层方法优先事务提交,然后外层方法再提交。
如果内层方法中存在异常,内层事务会优先回滚,外层方法如果没有捕获异常,外层方法事务也会回滚。
如果外层方法中存在异常,那么内层事务正常正常提交,而外层方法会进行回滚操作
nested外层方法中有事务,内层子事务那么直接创建一个保存点,外层事务能够提交,嵌套子事务才能够提交, 外层事务异常回滚,嵌套的子事务也无法提交,会清除savepoint,相当于回滚内层方法之前的操作。
如果内层方法执行没有异常情况,那么会清除保存点信息,并且在外层事务中进行提交操作。
如果内层方法中存在异常情况,会回滚到savepoint,如果外层事务调用子事务方法没有捕获异常,那么外层事务也将回滚,捕获异常,则不会回滚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值