Spring事务传播机制的区别

Mysql事务的隔离级别

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(mysql默认的隔离级别)

③ Read committed (读已提交):可避免脏读的发生。

④ Read uncommitted (读未提交):最低级别,任何情况都无法保证

 

 

1、A、B都是Propagation.REQUIRED

(1)B -》Participating in existing transaction

(2)Connection一致

(3)SqlSession一致

 

2、1、A:Propagation.REQUIRED、B:Propagation.REQUIRES_NEW

(1)B -》Suspending current transaction, creating new transaction

(2)Connection不一致

(3)SqlSession不一致

  (4) A->B->A发生异常 = A回滚B提交

 

3、A没有事务 B有事务

(1)A和B互不干扰,如果a中有异常,不会回滚已提交的因为它没有事务

(2)A->B->A 这三部分Connection不同和SqlSession都不同

 

 

PROPAGATION_*:事务传播行为.

        —————————————第一类AB在同一事务中—————————————

       注意:如果B发生异常,A将无法提交事务,因为在同一事务中,且在B中被被标记为rollback-only,所以就算A捕获异常也无济于事

(1) PROPAGATION_REQUIRED

                A中有事务,使用A中的事务.如果没有B就会开启一个新的事务,将A包含进来.(保证A,B在一个事务中)

 (2) PROPAGATION_SUPPORTS    

                A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.

 (3) PROPAGATION_MANDATORY

                A中有事务,使用A中的事务.如果A没有事务.抛出异常.

      ————————————第二类AB不在同一事务中———-----------——

         注意:B的事务状态不会影响A的事务,如果B中发生异常,只要在A中处理对应的异常即可

            如果A和B更改了同一个数据表中的同一个记录,则会产生死锁!!!

 (4) PROPAGATION_REQUIRES_NEW    

                A中有事务,将A中的事务挂起,创建一个新的事务,事物执行完成后,恢复A中的事物,继续执行A中的逻辑(保证A,B没有在一个事务中) 

                注意:如果B完成后将会提交B的事物,继续执行A的逻辑,如果此时发生异常,并不会回滚B中的数据(因为AB不在一个事务中,且B中的事务已经提交)

 (5) PROPAGATION_NOT_SUPPORTED

                A中有事务,将A中的事务挂起,以非事务方式执行  

                注意:此时B将查询不到A中更新后或A中新添加的数据

 (6) PROPAGATION_NEVER 

                A中有事务,抛出异常.即当前执行环境不能存在事务

          ———————第三类AB属于具有回滚点的嵌套事务——————————

         注意:A和B可以视为在同一事务中,因为AB中的数据互为可见

 (7) PROPAGATION_NESTED

                嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最    初始状态) 。执行过程:A开启事务,执行逻辑;B开始一个新事务,并创建一个回滚点,然后开始执行逻辑,如果发生异常,则回滚到所创建的回滚点;如果A没有对B发生的异常进行处理,则A继续回滚到最初始状态,如果对异常处理了,则提交数据

               执行过程注意:需在A中处理B中的异常才能进行回滚到对应的保存点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值