作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
先实战后原理
事务这个东西一开始理解起来比较复杂,所以我打断先讲下实战例子,有个概念,然后我们带着问题去看源码,期间我也会画图来辅助理解,尽可能把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不会。


结果:
![]()

其他的机制下一篇说吧。
621

被折叠的 条评论
为什么被折叠?



