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中的异常才能进行回滚到对应的保存点