60、Spring5.x源码之旅六十一AOP事务实战二

  • 先实战后原理
  • 7大传播机制
    • MANDATORY
    • 例子
  • REQUIRED
    • 例子
  • SUPPORTS
    • 例子

先实战后原理

事务这个东西一开始理解起来比较复杂,所以我打断先讲下实战例子,有个概念,然后我们带着问题去看源码,期间我也会画图来辅助理解,尽可能把7大传播机制都讲透,这样对事物的使用就得心应手了。

7大传播机制

其实可以分成3个支持当前事务,3个不支持当前事务,1个嵌套事务。什么是当前事务呢,你可以理解为A方法调用B方法,A有事务,那对于B来说,A的事务就是当前事务。
大致的传播机制就是这样:
*

MANDATORY

使用当前事务,当前如果没事务就报异常。

例子

*
直接抛出异常:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

REQUIRED

这个是属于默认的机制,其实就是用同一个连接,不管什么地方出现异常,都是要回滚的。
注解默认是这个设置:
*

例子

结果是回滚了,没插入进去,不管这个异常放在哪个方法里,都不会成功。
*
*

异常放外层,也是失败的,其实内部用的是同一个连接。
*
*
内部方法出了异常只是做了要回滚的标记,直到最外面的当前事务才会去真正的处理回滚,具体后面源码会分析。

SUPPORTS

使用当前事务,当前如果没事务就不管了。

例子

外层没事务的情况就不管了,内部抛异常也不管,所以user会插入成功,account不会。
*
*
结果:
*
*

其他的机制下一篇说吧。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。