Spring 事物管理

news/2024/10/18 15:46:45/文章来源:https://www.cnblogs.com/zz-1q/p/16119003.html

定义与描述

Spring 有事物传播属性,用于保证数据的统一提交与统一回滚
数据库 有事物特性(ACID)与数据隔离级别,用于处理脏读、幻读、不可重复读

Spring 事物管理,是指系统在多线程情况下,配合数据库事物完成数据的统一提交与统一回滚。网上很多关于事物的描述,都是基于数据库实现的。例如,银行转账、收费站收费等。
本片文章只讲事物管理

事务传播行为类型 使用说明
REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,继续当前事物。
SUPPORTS 支持事务。但如果当前没有事务,就以非事务方式执行。事物可有可无
MANDATORY 使用事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。然后创建一个与外事务没有关联的新事务。新事物有自己的隔离级别、锁。不依赖于外事务,可单独提交与回滚。新事物执行完后,外事务在进行提交操作。
NOT_SUPPORTED 不支持事物。如果当前存在事务,就把当前事务挂,执行内部方法。内部方法执行完,在执行外部事务。如果外部方法没有事务,可直接执行,不会挂起。
NEVER 不使用事物。如果当前存在事务,则抛出异常。
NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。内事务与外事务的关系:內事务必须在外事务提交之后在提交内事务的报错,会直回到保存点(savepoint,任务执行前的点),不会影响外事务的提交外事的报错会影响內事务的提交

REQUIRED、REQUIRES_NEW、NESTED ,这三个是日常系统中最常用的三种。

Spring 事物原理

   Spring事务是通过AOP实现的,首先是获取代理对象,然后通过AOP的整体流程执行后面的操作逻辑。一般是通过通知的方式实现功能增强,但事务是通过TransactionInterceptor来实现的,通过调用invoke完成事务逻辑。主要是调用其父类(TransactionAdviceSupportd)的invokeWithInTransaction方法,以下逻辑也是此方法里的逻辑。

@EnableTransactionManagement 注解开启事物管理。

逻辑步骤:

  1. 准备工作,解析各个方法的注解与属性,判断是否需要重新开启新事务
  2. 如果开始事务,需要后去数据库链接,并关闭自动提交功能
  3. 执行sql
  4. 如果失败,执行completeTransactionAfterThrowing方法,调用里面的doRollBack方法
  5. 如果成功,执行commitTransactionAfterReturn方法,调用里面的doCommit方法
  6. 最后的最后,执行cleanTransactionInfo方法,清空事务信息

invokeWithInTransaction 代码逻辑(简化)

    // 事务逻辑调用方法protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, TransactionAspectSupport.InvocationCallback invocation) throws Throwable {// 获取事务属性TransactionAttributeSource tas = this.getTransactionAttributeSource();TransactionAttribute txAttr = tas != null ? tas.getTransactionAttribute(method, targetClass) : null;// 获取 beanFactory中的 事务管理对象PlatformTransactionManager tm = this.determineTransactionManager(txAttr);String joinpointIdentification = this.methodIdentification(method, targetClass, txAttr);// 声明一个事务Object result;// 判断 tm 是走自定义任务管理器,还是默认管理器if (txAttr != null && tm instanceof CallbackPreferringPlatformTransactionManager) {// 自定义事务TransactionAspectSupport.ThrowableHolder throwableHolder = new TransactionAspectSupport.ThrowableHolder();result = ((CallbackPreferringPlatformTransactionManager)tm).execute(txAttr, (status) -> {//创建事务,事务属性等信息保存到TransactionInfo中TransactionAspectSupport.TransactionInfo txInfo = this.prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);try {// 执行目标方法Object var8 = invocation.proceedWithInvocation();return var8;} catch (Throwable var13) {} finally {this.cleanupTransactionInfo(txInfo);}});return result;} else {// 系统默认管理器//创建事务,事务属性等信息保存到TransactionInfo中TransactionAspectSupport.TransactionInfo txInfo = this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);result = null;try {// 执行目标方法result = invocation.proceedWithInvocation();} catch (Throwable var17) {// 异常执行 doRollBack 方法this.completeTransactionAfterThrowing(txInfo, var17);throw var17;} finally {// 最后的最后执行 clean ,清空事务信息this.cleanupTransactionInfo(txInfo);}// 成功执行  doCommit 方法this.commitTransactionAfterReturning(txInfo);return result;}}

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

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

相关文章

OpenCity: Open Spatio-Temporal Foundation Models for Traffic Prediction

1. 数据准备 在这个数据处理过程中,以数据集 PEMS07M 为例,整个数据抽取和划分过程如下:初始数据维度:原始训练数据 data_train 的维度为 (12672, 228, 3)。其中:12672 表示时间步数,代表不同的时间点采样的数据。 228 表示空间节点数(例如不同的交通站点)。 3 表示每个…

04C++顺序结构(3)

1、设置域宽setw(); 2、cin语句; 3、输入输出.格式化一、设置域宽setw() 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽。 使用setw()前,必须包含头文件iomanip,即#include<iomanip> 头文件iomanip,用来声明一些“流操作符”,需要一定格式输入输出时,就…

轻松上手-MVVM模式_关系型数据库_云函数T云数据库

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…

九宫格自由流转拼图游戏

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…

数据预处理-DataFrame切片

此Blog仅作为日常学习工作中记录使用,Blog中有不足之处欢迎指出 以kaggle中房屋预测的训练集为例,说明DataFrame切片常用操作 一、读入数据 import numpy as np import pandas as pdfile_path = ***\kaggle_house_pred_train.csv data = pd.read_csv(file_path)data.columns …

轻松上手-Navigation路由 H5

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…

Audio

音频文件导入 常用格式wav mp3 aiff音频文件属性设置Force To Mono:多声道转单声道; Normalize:强制为单声道时,混合过程中被标准化 Load In Background:在后台加载时,不阻塞主线程 Ambisonic:立体混响声,非常适合360度视频和XR应用程序,如果音频文件包含立体混响声编…

RenderTexture

基础概念 RenderTexture 在Unity中,RenderTexture是一种纹理,它可以在运行时动态地生成图像数据,并且可以作为着色器的输入或者显示在游戏世界的任何材质上。简单来说,RenderTexture让你能够将场景或特定相机的渲染结果捕获到一个纹理中,然后这个纹理可以被用作其他渲染过…

九点共圆及其圆心证明(证明过程已更新)

九点共圆及其圆心证明主要思路:固定 \(P,L\),证明其它七个点均在以 \(PL\) 为直径的圆上。 条件的来源会备注在括号内。背景可能影响观感,建议打开极简模式阅读。这是一个三角形 \(\triangle ABC\),设 \(BC,AC,AB\) 边上垂足分别为 \(D,E,F\),其边上中点分别为 \(L,M,N\),…

【喜讯】全球电商大数据平台推出F类免费API接口服务!

好消息,全球电商大数据平台再次上线多个类别接口,首次推出F类免费API接口服务,为所有追求数据赋能、寻求创新突破的企业和个人,带来了前所未有的机遇。好消息,值此之际;全球电商大数据平台再次上线多个类别接口,首次推出F类免费API接口服务,为所有追求数据赋能、寻求创…

c# winform在线升级clickonce

说明:在线升级前提 1,一个可以访问在线的地址,2,发布前要在项目属性发布里配置好相关设置 一,可以在IIS上布署一个可以访问的地址 二,发布前配置

SQLSEVER 实现货币数字转中文汉字

SQLSEVER 实现数字转换成中文(货币) -- ============================================= -- Author: LearnerPing -- Create date: 2024/10/18 -- Description: Change Number to Chinese -- ============================================= Create FUNCTION GetNumberToChi…