【笔记】Spring的事务是如何回滚的/Spring的事务管理是如何实现的

Spring的事务是如何回滚的/Spring的事务管理是如何实现的

数据库(Spring事务)
1、建立连接、开启事务(准备工作)
2、进行sql操作(业务逻辑)
3、执行成功,则commit;
执行失败,则rollback
在这里插入图片描述
总:Spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInteceptor来实现的,然后调用invoke来实现具体的逻辑
分:1、先做准备工作,解析各个方法上事务相关的属性(隔离性、传播特性),根据具体的属性来判断是否开启新事物
2、当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务
3、执行具体的sql逻辑操作
4、在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack来实现的,实现的时候也要获取连接对象,通过连接对象来回滚

protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {
    // 判断当前是否存在事务
    if (txInfo != null && txInfo.hasTransaction()) {
        if (logger.isTraceEnabled()) {
            logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() +
                "] after exception: " + ex);
        }
        // 判断是否满足回滚条件
        if (txInfo.transactionAttribute.rollbackOn(ex)) {
            try {
                // 回滚处理
                txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
            }
            // 其余代码
        }
        else {
            try {
                // 如果不满足回滚条件出现异常也会继续提交
                txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
            }
            // 其余代码
        }
    }
}
    回滚操作,获取当前线程的数据库连接并调用其rollback方法进行回滚,使用的是底层数据库protected void doRollback(DefaultTransactionStatus status) {
    DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
    // 获取数据库连接
    Connection con = txObject.getConnectionHolder().getConnection();
    if (status.isDebug()) {
        logger.debug("Rolling back JDBC transaction on Connection [" + con + "]");
    }
    try {
        // 调用数据库的回滚
        con.rollback();
    }
    catch (SQLException ex) {
        throw new TransactionSystemException("Could not roll back JDBC transaction", ex);
    }
}

5、如果执行过程中,没有任何意外情况的发生,那么通过completeTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是要获取链接,通过连接对象来提交
6、当事务执行完毕之后需要清除相关的事务信息cleanupTransactionInfo

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 执行过程

MySQL 的执行流程也确实是一个复杂的过程,它涉及多个组件的协同工作,故而在面试或者工作的过程中很容易陷入迷惑和误区。 MySQL 执行过程 本篇将以 MySQL 常见的 InnoDB 存储引擎为例,为大家详细介绍 SQL 语句的执行流程。从连接器开始&…

直播的营销多样性

直播的营销多样性主要体现在以下几个方面: 1.互动性高:直播能够实时互动,观众可以提问、评论、点赞,甚至直接在直播中购买商品,这种互动性使得直播成为一种非常有效的营销手段。 2.内容生动:直播能够以视频的形式展示产品或服务,相比传统的…

概率论相关题型

文章目录 概率论的基本概念放杯子问题条件概率与重要公式的结合独立的运用 随机变量以及分布离散随机变量的分布函数特点连续随机变量的分布函数在某一点的值为0正态分布标准化随机变量函数的分布 多维随机变量以及分布条件概率max 与 min 函数的相关计算二维随机变量二维随机变…

UWB高精度人员定位系统源码,全方位护航安全生产

定位管理系统使用UWB定位技术,通过在厂区安装定位基站,为人员或设备佩戴定位标签的形式,实现人员精准实时定位。可以实现人员、车辆物资实时定位、工作考勤、电子围栏、历史轨迹回放、巡检巡查、物资盘点、路径规划、三维显示等,以…

JAVA B/S架构智慧工地源码,PC后台管理端、APP移动端

智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术,以PC端,移动端,设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…

【小白专用】C# 压缩文件 ICSharpCode.SharpZipLib.dll效果:

插件描述: ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip、Tar 、 BZip2 类库,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL,底线是允许用在不开源商业软件中,意思就是免费使用。具体可访问ICSha…

【AI】文本转语音 变声 音色克隆 数字人音视频口型同步AI应用

文本转语音 项目地址:https://github.com/coqui-ai/TTS 环境安装: 下载项目;安装Python,安装项目依赖: pip install TTS 1. 下载安装AI模型: https://github.com/facebookresearch/fairseq/tree/main…

大数据框架数仓Doris学习网站,让你轻松掌握数据仓库技能。

介绍:Doris是一款基于大规模并行处理技术的分布式SQL数据库,由百度开源,主要用于实时数据仓库和多维分析。它是一款大数据分析引擎,适用于实时分析场景,支持多种数据接入和输出,提供丰富的核心特性和性能优…

面试算法77:链表排序

题目 输入一个链表的头节点,请将该链表排序。 分析 归并排序的主要思想是将链表分成两个子链表,在对两个子链表排序后再将它们合并成一个排序的链表。 这里可以用快慢双指针的思路将链表分成两半。如果慢指针一次走一步,快指针一次走两步…

【Midjourney】Midjourney根据prompt提示词生成人物图片

目录 🍇🍇Midjourney是什么? 🍉🍉Midjourney怎么用? 🔔🔔Midjourney提示词格式 Midjourney生成任务示例 例1——航空客舱与乘客 prompt prompt翻译 生成效果 大图展示 细节大…

见证创新实力!安全狗云甲荣获“ISC 数字安全创新能力百强”

12月27日,数字安全技术创新论坛暨ISC 2023数字安全创新能力百强颁奖典礼在北京顺利举办。 作为国内云原生安全领导厂商,安全狗也受邀出席此次活动。 厦门服云信息科技有限公司(品牌名:安全狗)创办于2013年,…

基于YOLOv8的遥感SAR舰船小目标识别

💡💡💡本文摘要:基于YOLOv8的遥感SAR舰船小目标,阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…

【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)

文章目录 🍔Bean的获取🎄注入IOC容器对象⭐代码实现🛸根据bean的名称获取🛸根据bean的类型获取🛸根据bean的名称和类型获取 🎄Bean的作用域⭐代码实现🎈注意 🎄第三方Bean⭐代码实现…

Spring系列学习四、Spring数据访问

Spring数据访问 一、Spring中的JDBC模板介绍1、新建SpringBoot应用2、引入依赖:3、配置数据库连接,注入dbcTemplate对象,执行查询:4,测试验证: 二、整合MyBatis Plus1,在你的项目中添加MyBatis …

企业跨境数据传输的创新技术和应用领域

在当前数字化时代,跨境数据传输成为一个极为关键的领域。随着数据传输需求的不断增加,跨国企业在这一过程中面临着越来越多的问题。为了解决这些挑战,创新技术层出不穷,为跨境数据传输提供了更高效、安全和可靠的解决方案。本文将…

FAST-LIO论文解析

题目:FAST-LIO:一种快速鲁棒的基于紧耦合迭代卡尔曼滤波的雷达-惯导里程计 摘要 本文提出了一种计算效率高、鲁棒性好的激光-惯性里程计框架。我们使用紧耦合的迭代扩展卡尔曼滤波器将LiDAR特征点与IMU数据融合在一起,从而在快速运动、嘈杂…

XHR与Fetch的功能异同点列表

XHR与Fetch的功能异同点列表

Flink Shuffle、Spark Shuffle、Mr Shuffle 对比

总结: 1、Flink ShufflePipelined Shuffle:上游 Subtask 所在 TaskManager 直接通过网络推给下游 Subtask 的 TaskManager;Blocking Shuffle: Hash Shuffle-将数据按照下游每个消费者一个文件的形式组织; Sort-Merge …

《论文阅读:Backdoor Attacks Against Dataset Distillation》

数据浓缩下的后门攻击 1. 摘要 数据集蒸馏已成为训练机器学习模型时提高数据效率的一项重要技术。它将大型数据集的知识封装到较小的综合数据集中。在这个较小的蒸馏数据集上训练的模型可以获得与在原始训练数据集上训练的模型相当的性能。然而,现有的数据集蒸馏技…

下载完redis每次启动项目必须打开redis服务,否则不能运行,解决方法

redis-server.exe --service-install redis.windows.conf 在redis的目录启动终端运行此命令可以下载redis服务,然后在服务里面启动redis服务,之后就可以不用打开小黑框再启动了 redis下载地址: Redis下载安装教程_redis 3.2下载-CSDN博客