Spring 事务实现

Spring 事务实现

Spring 事务使用

@Transactional注解配置项事务传播行为PROPAGATION_REQUIRED当前方法必须在事务中,没有就创建,有就加入。PROPAGATION_SUPPORTS有事务就加入,没有就以非事务方式执行。PROPAGATION_MANDATORY有事务就加入,没有就抛出异常。PROPAGATION_REQUIRES_NEW永远创建新事务执行,之前若有事务则挂起之前的事务。PROPAGATION_NOT_SUPPORTED以非事务方式执行。之前若有事务则挂起之前的事务。PROPAGATION_NEVER以非事务方式执行。之前若有事务则抛出异常。PROPAGATION_NESTED当前若有事务,则在嵌套事务内执行。如果当前没有事务,则按 REQUIRED 属性执行。事务隔离级别readOnly设置超时时间异常回滚设置rollbackForrollbackForClassNamenoRollbackFornoRollbackForClassName

Spring 事务实现

总体流程

启动阶段创建代理对象(参见AOP逻辑)获取切面列表创建aop代理对象
事务执行获取事务属性获取事务管理器,创建事务创建物理连接autoCommit等连接属性设置物理连接和当前线程绑定调用目标方法,执行业务逻辑回滚/提交事务前置处理物理连接执行rollback/commit操作后置处理后置清理清理threadLocal重置autoCommit关闭连接重置 connectionHolder

启动阶段创建代理对象逻辑

参考我之前写的 Spring AOP 实现。
启动阶段创建代理对象逻辑

执行阶段调用链路

事务执行阶段,会通过启动阶段生成的代理类调用目标方法,在此之前通过 TransactionAspectSupport 处理自动开启事务/提交事务等逻辑。调用链路如下:

aop.framework.CglibAopProxy.CglibMethodInvocation#proceed 
事务处理流程aop.framework.ReflectiveMethodInvocation#proceedtransaction.interceptor.TransactionInterceptor#invoke事务拦截器处理transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction 事务内调用目标方法transaction.interceptor.TransactionAspectSupport#getTransactionAttributeSourcetransaction.interceptor.AbstractFallbackTransactionAttributeSource#getTransactionAttribute获取 transactionAttributetransaction.interceptor.TransactionAspectSupport#determineTransactionManager 获取事务管理器transaction.interceptor.DefaultTransactionAttribute#getQualifiertransaction.interceptor.TransactionAspectSupport#getTransactionManagerutil.ConcurrentReferenceHashMap#get缓存获取 tmbeans.factory.support.DefaultListableBeanFactory#getBean 缓存没有,则通过 beanFactory 获取事务管理器 beanutil.ConcurrentReferenceHashMap#putIfAbsent 缓存事务管理器transaction.interceptor.TransactionAspectSupport#asPlatformTransactionManager 将 tm 转成 PlatformTransactionManager 类型transaction.interceptor.TransactionAspectSupport#methodIdentification 获取方法名标识transaction.interceptor.TransactionAspectSupport#methodIdentificationtransaction.interceptor.DefaultTransactionAttribute#getDescriptortransaction.interceptor.TransactionAspectSupport#createTransactionIfNecessary 创建事务transaction.support.DefaultTransactionDefinition#getNametransaction.support.AbstractPlatformTransactionManager#getTransaction 通过 tm 获取事务jdbc.datasource.DataSourceTransactionManager#doGetTransaction 创建 DataSourceTransactionObject 对象jdbc.datasource.JdbcTransactionObjectSupport#setSavepointAllowedjdbc.datasource.DataSourceTransactionManager#obtainDataSource 获取 dataSourcetransaction.support.TransactionSynchronizationManager#getResourcejdbc.datasource.DataSourceTransactionManager.DataSourceTransactionObject#setConnectionHolderjdbc.datasource.DataSourceTransactionManager#isExistingTransaction 通过判断 connectionHolder 是否为空判断是否在事务中jdbc.datasource.JdbcTransactionObjectSupport#hasConnectionHoldertransaction.support.DelegatingTransactionDefinition#getTimeout获取超时时间transaction.support.DelegatingTransactionDefinition#getPropagationBehavior获取传播属性transaction.support.AbstractPlatformTransactionManager#suspend 当前如果有事务挂起事务,根据传播行为决定transaction.support.TransactionSynchronizationManager#isSynchronizationActivetransaction.support.AbstractPlatformTransactionManager#startTransaction 开启事务transaction.support.AbstractPlatformTransactionManager#getTransactionSynchronizationtransaction.support.AbstractPlatformTransactionManager#newTransactionStatus 创建 DefaultTransactionStatusjdbc.datasource.DataSourceTransactionManager#doBegin 开启事务jdbc.datasource.JdbcTransactionObjectSupport#hasConnectionHolderjdbc.datasource.DataSourceTransactionManager#obtainDataSource 获取 dataSource,创建 connectionjdbc.datasource.DataSourceTransactionManager.DataSourceTransactionObject#setConnectionHolder 将 connection 包成 holder 塞到 DataSourceTransactionObject 里jdbc.datasource.JdbcTransactionObjectSupport#setConnectionHoldertransaction.support.ResourceHolderSupport#setSynchronizedWithTransactionjdbc.datasource.ConnectionHolder#getConnectionjdbc.datasource.DataSourceUtils#prepareConnectionForTransaction 连接做准备工作,比如是否要设置 readonly,隔离级别jdbc.datasource.JdbcTransactionObjectSupport#setPreviousIsolationLevel 塞值jdbc.datasource.JdbcTransactionObjectSupport#setReadOnly 塞值com.mysql.cj.jdbc.ConnectionImpl#getAutoCommit 如果物理连接是自动提交 autoCommit=truejdbc.datasource.DataSourceTransactionManager.DataSourceTransactionObject#setMustRestoreAutoCommit 设置DataSourceTransactionObject属性,后面需要恢复autoCommit值com.mysql.cj.jdbc.ConnectionImpl#setAutoCommit 设置 autoCommit为false,非自动提交jdbc.datasource.DataSourceTransactionManager#prepareTransactionalConnectionjdbc.datasource.ConnectionHolder#setTransactionActive 设置事务 active 状态transaction.support.AbstractPlatformTransactionManager#determineTimeout 设置事务超时时间transaction.support.TransactionSynchronizationManager#bindResource 将物理连接和当前线程绑定,threadLocal-> map<dataSource, connectionHolder>transaction.support.AbstractPlatformTransactionManager#prepareSynchronization 向TransactionSynchronizationManager里设置隔离级别,readonly等属性transaction.support.DelegatingTransactionDefinition#getIsolationLeveltransaction.support.TransactionSynchronizationManager#setCurrentTransactionIsolationLevel 设置隔离级别transaction.support.DelegatingTransactionDefinition#isReadOnlytransaction.support.TransactionSynchronizationManager#setCurrentTransactionReadOnly 设置 readonlytransaction.support.TransactionSynchronizationManager#setCurrentTransactionNametransaction.support.TransactionSynchronizationManager#initSynchronizationtransaction.interceptor.TransactionAspectSupport#prepareTransactionInfo 将 transactionInfo 和当前线程绑定transaction.interceptor.TransactionAspectSupport.TransactionInfo#newTransactionStatustransaction.interceptor.TransactionAspectSupport.TransactionInfo#bindToThreadaop.framework.CglibAopProxy.CglibMethodInvocation#proceed 调用目标方法aop.framework.ReflectiveMethodInvocation#proceedaop.framework.CglibAopProxy.CglibMethodInvocation#invokeJoinpointcglib.proxy.MethodProxy#invokecom.zc.example.service.impl.OrderServiceImpl$$FastClassBySpringCGLIB$$a1c48f40#invoke通过cglib代理类调用目标方法com.zc.example.service.impl.OrderServiceImpl#saveFailedtransaction.interceptor.TransactionAspectSupport#completeTransactionAfterThrowing 事务异常场景处理transaction.interceptor.TransactionAspectSupport.TransactionInfo#getTransactionStatustransaction.interceptor.DelegatingTransactionAttribute#rollbackOn 判断异常是否需要回滚transaction.interceptor.RuleBasedTransactionAttribute#rollbackOntransaction.support.AbstractPlatformTransactionManager#rollback 如果需要回滚,则执行回滚transaction.support.AbstractPlatformTransactionManager#processRollback 处理回滚transaction.support.AbstractPlatformTransactionManager#triggerBeforeCompletion 前置处理transaction.support.DefaultTransactionStatus#isNewSynchronizationtransaction.support.TransactionSynchronizationUtils#triggerBeforeCompletiontransaction.support.TransactionSynchronizationManager#getSynchronizationstransaction.support.TransactionSynchronizationManager#unbindResourcejdbc.datasource.DataSourceUtils#releaseConnectionjdbc.datasource.DataSourceTransactionManager#doRollback 执行回滚操作transaction.support.DefaultTransactionStatus#getTransactionjdbc.datasource.JdbcTransactionObjectSupport#getConnectionHolderjdbc.datasource.ConnectionHolder#getConnection获取物理连接,执行回滚操作jdbc.datasource.SimpleConnectionHandle#getConnection 获取物理连接con.rollback() 通过物理连接执行回滚transaction.support.AbstractPlatformTransactionManager#triggerAfterCompletion 后置处理transaction.support.TransactionSynchronizationManager#getSynchronizationstransaction.support.TransactionSynchronizationManager#clearSynchronizationtransaction.support.AbstractPlatformTransactionManager#invokeAfterCompletiontransaction.support.AbstractPlatformTransactionManager#cleanupAfterCompletion 后置清理transaction.support.AbstractTransactionStatus#setCompletedtransaction.support.TransactionSynchronizationManager#clear 清理TransactionSynchronizationManager里的threadLocal信息jdbc.datasource.DataSourceTransactionManager#doCleanupAfterCompletion 执行后置清理jdbc.datasource.DataSourceTransactionManager#obtainDataSourcetransaction.support.TransactionSynchronizationManager#unbindResource 清理当前线程threadLocal绑定的dataSourcejdbc.datasource.JdbcTransactionObjectSupport#getConnectionHolderjdbc.datasource.DataSourceTransactionManager.DataSourceTransactionObject#isMustRestoreAutoCommit 判断是否需要重置autoCommit值con.setAutoCommit(true)重置autoCommitjdbc.datasource.DataSourceUtils#resetConnectionAfterTransaction 连接重置操作jdbc.datasource.DataSourceUtils#releaseConnection 将连接关闭放回连接池jdbc.datasource.DataSourceUtils#doReleaseConnectionjdbc.datasource.DataSourceUtils#doCloseConnectionjdbc.datasource.ConnectionHolder#clear 清理txObject.connectionHolder里的信息transaction.interceptor.TransactionAspectSupport#cleanupTransactionInfo 清理transactionInfoHoldertransaction.interceptor.TransactionAspectSupport.TransactionInfo#restoreThreadLocalStatus

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法挨揍日记】day41——【模板】01背包、416. 分割等和子集

【模板】01背包_牛客题霸_牛客网你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为 ,。题目来自【牛客题霸】https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e?tpId230&tqId2032484&ru/exam/oj&qru…

Flutter基础

一、关键字 class&#xff1a;用于定义一个新的类&#xff1b; extends: 用于指定一个类继承另一个类&#xff1b; mixin: 用于将一个类的代码片段添加到另一个类中&#xff0c;实现代码复用&#xff1b; abstract: 用于声明一个抽象类或抽象方法&#xff0c;不能直接实例化&a…

C++ map容器

通俗一点讲map其实就是python的字典(学会python字典 c_map)!!! map和unordered_map都是C中的关联容器&#xff0c;用于存储键值对。其主要区别在于底层实现方式和性能表现。 1、底层实现方式   map内部使用红黑树&#xff08;一种自平衡二叉查找树&#xff09;来实现&…

HarmonyOS-ArkTS基本语法及声明式UI描述

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…

机器学习常用算法模型总结

文章目录 1.基础篇&#xff1a;了解机器学习1.1 什么是机器学习1.2 机器学习的场景1.2.1 模式识别1.2.2 数据挖掘1.2.3 统计学习1.2.4 自然语言处理1.2.5 计算机视觉1.2.6 语音识别 1.3 机器学习与深度学习1.4 机器学习和人工智能1.5 机器学习的数学基础特征值和特征向量的定义…

Shell 文本处理常用命令

1、Sed sed 即 Stream EDitor&#xff0c;和 vi 不同&#xff0c;sed是基于行的文本编辑器。 Sed是从文件或管道中读取一行&#xff0c;处理一行&#xff0c;输出一行&#xff1b;再读取一行&#xff0c;再处理一行&#xff0c;再输出一行&#xff0c;直到最后一行。 # 查看文…

软件测试/测试开发丨Python 模块与包

python 模块与包 python 模块 项目目录结构 组成 package包module模块function方法 模块定义 定义 包含python定义和语句的文件.py文件作为脚本运行 导入模块 import 模块名from <模块名> import <方法 | 变量 | 类>from <模块名> import * 注意&a…

小红书如何高效引流?

近年来&#xff0c;公域流量价格不断上涨&#xff0c;私域流量的优势逐渐凸显。企业正花费大量资源和成本来获取新流量&#xff0c;但与其如此&#xff0c;不如将精力放在留存和复购上&#xff0c;从而实现业绩的新增长。其中关键在于如何有效地将公域流量转化为私域流量。 然而…

c++期末考题笔试来咯

最后一道大题题目再现 写一个person类&#xff0c;有姓名&#xff0c;性别&#xff0c;年龄。然后在此基础上派生出教师类和学生类。教师类增加了以下数据&#xff1a;工号&#xff0c;职称&#xff0c;工资。学生类增加了以下数据成员&#xff1a;学号&#xff0c;专业&#…

JVM调优相关参数学习

Xms 是指设定程序启动时占用内存大小。一般来讲&#xff0c;大点&#xff0c;程序会启动的快一点&#xff0c;但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存&#xff0c;超出了这个设置值&#xff0c;就会抛…

境内深度合成服务算法备案清单(2023年12月)

截止2024年1月3日&#xff0c;第三批深度合成服务算法备案信息的公告尚未发布&#xff0c;预计将会在2024-1-10左右发布&#xff0c;我公司已知晓部分公示名单&#xff0c;如中国电信数字人生成算法&#xff0c;详情联系WX号&#xff1a;SuanfabeiandayuAI生成合成类算法应办理…

借助文档控件Aspose.Words,在 Word 文档中创建和修改 VBA 宏

通常&#xff0c;Word 文档包含 Visual Basic for Applications (VBA) 代码&#xff0c;用于自动执行任务并增强文档功能。如果您是 Java 开发人员&#xff0c;您可能想知道如何与 Word 文档中的 VBA 代码进行交互和修改。因此&#xff0c;在这篇博文中&#xff0c;我们将探讨如…

ArkTS - @Prop、@Link

一、作用 Prop 装饰器 和Link装饰器都是父组件向子组件传递参数&#xff0c;子组件接收父组件参数的时候用的&#xff0c;变量前边需要加上Prop或者Link装饰器即可。&#xff08;跟前端vue中父组件向子组件传递参数类似&#xff09; // 子组件 Component struct SonCom {Prop…

管程-第三十三天

目录 为什么要引入管程 管程的定义和基本特征 用管程解决生产者消费者问题 结论 本节思维导图 为什么要引入管程 原因&#xff1a;在解决进程的同步与互斥问题时&#xff0c;信号量机制存在编写困难和易出错的问题 能不能设计一种机制&#xff0c;让程序员写程序时不再需…

centos7下Iptables的安装(离线)

centos默认使用的防火墙是firewall&#xff0c;此防火墙不好控制端口防火墙的开闭&#xff0c;所以可以使用三方的插件来进行端口的防火墙开闭。这里就提供了Iptables组件来进行控制。本文就将介绍iptables的安装。 提供的安装包&#xff1a; 链接&#xff1a;https://pan.bai…

openGauss学习笔记-184 openGauss 数据库运维-升级-升级验证

文章目录 openGauss学习笔记-184 openGauss 数据库运维-升级-升级验证184.1 验证项目的检查表184.2 升级版本查询184.2.1 验证步骤 184.3 检查升级数据库状态184.3.1 验证步骤 openGauss学习笔记-184 openGauss 数据库运维-升级-升级验证 本章介绍升级完成后的验证操作。给出验…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

虹科方案丨从困境到突破:TigoLeap方案引领数据采集与优化变革

来源&#xff1a;虹科工业智能互联 虹科方案丨从困境到突破&#xff1a;TigoLeap方案引领数据采集与优化变革 原文链接&#xff1a;https://mp.weixin.qq.com/s/H3pd5G8coBvyTwASNS_CFA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 在数字化工厂和智能制造时…

connection refused

nohup /home/bavon/miniconda3/envs/SLFCD/bin/python -m visdom.server -port 8098 >/home/bavon/logs/visdom.log 2>&1 &

8086CPU的寻址方式(7种)

基本概念 立即操作数&#xff1a;操作数包含在指令中寄存器操作数&#xff1a;操作数包含在CPU的某个内部寄存器中存储器操作数&#xff1a;约定操作数事先存放在存储器中存放数据的某个单元基本格式 MOV xx,yy xx&#xff1a;目的操作数字段 yy&#xff1a;源操作数字段 EA&a…