Spring事务实现基本原理, Spring事务传播行为实现原理:
Spring事务实现基本原理,
使用:
1 | 1 @EnableTransactionManagement |
原理:
1.解析切面 ——> bean的创建前第一个bean的后置处理器进行解析advisor(pointcut(通过@Transacational解析的切点) , advise)
(这个advisor 是通过@EnableTransactionManagement注册了一个配置类,该配置类就配置了adivsor)
2.创建动态代理——> bean的初始化后调用bean的后置处理器进行创建动态代理(有接口使用jdk,没接口使用cglib), 创建动态代理之
前会先根据advisor中pointCut 匹配@Transacational( 方法里面是不是有、类上面是不是有、接口或父类上面是不是有 ) , 匹配到就创
建动态代理。
3.调用: 动态代理
try{
4.创建一个数据库连接Connection, 并且修改数据库连接的autoCommit属性为false,禁止此连接的自动提交,这是
实现Spring事务非常重要的一步
5.然后执行目标方法方法,方法中会执行数据库操作sql
}
catch{
6.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
}
7.执行完当前方法后,如果没有出现异常就直接提交事务
Spring事务传播行为实现原理:
2.Spring的事务信息是存在ThreadLocal中的, 所以一个线程永远只能有一个事务,
融入:当传播行为是融入外部事务则拿到ThreadLocal中的Connection、共享一个数据库连接共同提交、回滚;
创建新事务:当传播行为是创建新事务,会将嵌套新事务存入ThreadLocal、再将外部事务暂存起来; 当嵌套事务提交、回滚后,会将暂存的事务信息恢复到ThreadLocal中
调用:融入
1 2 3 4 5 | try { 1 外部.创建一个数据库连接Connection存入ThreadLocal, 并且修改数据库连接的autoCommit属性为 false ,返回事务状态信息(Transactio nInfo.newTransaction= true ) 2 外部.然后执行目标方法方法(调用了内部事务方法)方法中会执行数据库操作sql 3 .内嵌:判断ThreadLocal是否已经有Connection,有的话就说明是一个内嵌事务, 判断当前事务的传播行为 融入:不会创建Connection,返回事务状态信息(TransactionInfo.newTransaction= false ) 4 .内嵌:然后执行目标方法方法方法中会执行数据库操作sql } catch { 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务 } <br> 5 内嵌:判断newTransaction== true 就提交事务 <br> 6 .外部: 判断newTransaction== true 拿到ThreadLocal中的Connection进行提交 |
调用:创建新事务
1 2 3 4 5 6 7 8 | try { 创建Connection放入ThreadLocal,返回事务状态信息(TransactionInfo.newTransaction=ture,TransactionInfo.外部事务的信息暂存) 1 外部.创建一个数据库连接Connection存入ThreadLocal, 并且修改数据库连接的autoCommit属性为 false ,返回事务状态信息(Transactio nInfo.newTransaction= true ) 2 外部.然后执行目标方法方法(调用了内部事务方法)方法中会执行数据库操作sql 3 .内嵌:判断ThreadLocal是否已经有Connection,有的话就说明是一个内嵌事务, 判断当前事务的传播行为 创建新事务:会把外层事务相关的事务信息(Connection、隔离级别、是否只读....暂存同时会把外层事务的ThreadLocal存储的事务信息都 置空)<br><br> 4 .内嵌:然后执行目标方法方法方法中会执行数据库操作sql } 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务 }<em id= "__mceDel" > 5 内嵌:判断newTransaction== true 就提交事务, 判断是否暂存事务, 把暂存的事务信息回归ThreadLocal中 <br> 6 .外部: 判断newTransaction== true 拿到ThreadLocal中的Connection进行提交</em> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具