作者简介:大家好,我是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
不会。
结果:
其他的机制下一篇说吧。