springboot下@transcation使用基本介绍

news2024/11/17 13:46:41

springboot下@transcation基本使用的几种可能

普通常使用的几种可能(事务的传播行为默认值Propagation.REQUIRED):

  1. @transcation只在使用方法A上,A内无调用其他方法,事务正常
  2. 方法A和方法B在同一个类下,@transcation都用在方法A和方法B上,A方法内调用B方法,A的事务正常,B的事务失效,且B的报错会导致A的事务进行回滚,即A和B都在A的事务中
  3. 方法A和方法B在同一个类下,@transcation只用在方法B上,A方法内调用B方法,B的事务失效,即使B方法报错也不会进行回滚,即B在报错前产生的脏数据会录入数据库
  4. 方法A和方法B不在同一个类下,@transcation都用在方法A和方法B上,A方法内调用B方法,会因为B方法的@transcation设置的事务传播性的值不同而不同,B方法的传播行为值为Propagation.REQUIRES_NEW时和为其他值时有不同的结果
  5. 方法A和方法B不在同一个类下,@transcation只用在方法B上,A方法内调用B方法,B的事务正常,B报错会回滚B方法的操作,但是如果A在调用B之前已经对数据库进行的操作不会执行回滚
  6. 开启代理(@EnableAspectJAutoProxy(exposeProxy = true)),并暴露代理器(AopContext.currentProxy())能使第3点的方法B的事务生效
  7. 方法的访问权限除了public外,其他权限都会使得@transcation事务失效
  8. Transaction rolled back because it has been marked as rollback-only(事务已回滚,因为它已标记为仅回滚) 问题

场景一:

  • @transcation只在使用方法A上,A内无调用其他方法,事务正常,报错了则回滚数据库的操作,数据库并未有脏数据的产生

在这里插入图片描述


场景二:

  • 方法A和方法B在同一个类下,@transcation都用在方法A和方法B上,A方法内调用B方法,A的事务正常,B的事务失效,且B的报错会导致A的事务进行回滚,即A和B都在A的事务中

在这里插入图片描述

可以看到方法A正常插入数据库,而方法B的报错执行事务的回滚也会导致A方法之前的插入操作回滚,这是因为在A方法类调用B方法是通过this.xxx()调用而不是经过代理调用,是无法对方法B的事务生效的,相当于了A方法和B方法都在A方法的事务中,这个原理可以参考下面的文章,比较详细的解析了


场景三:

  • 方法A和方法B在同一个类下,@transcation只用在方法B上,A方法内调用B方法,B的事务失效,即使B方法报错也不会进行回滚,即B在报错前产生的脏数据会录入数据库

在这里插入图片描述

可以看到方法B报错了但是第一条的数据还是入库了,而且也没有影响到方法A的数据操作,就是相当于方法B事务失效,和完全没有写事务的情况一样,这个原因还是和上面场景二的一样,方法内调用使用的是this.xxx()


场景四:

  • 方法A和方法B不在同一个类下,@transcation都用在方法A和方法B上,A方法内调用B方法,会因为B方法的@transcation设置的事务传播性的值不同而不同

B方法的传播行为值为Propagation.REQUIRES_NEW时,第一种情况报错在B方法

在这里插入图片描述

在这里插入图片描述

可以看到两个方法的数据都没有入库,方法B的方法报错事务进行了回滚也会影响到方法A,是因为调用方法B报错了会返回告诉方法A发生错误,因为方法B也属于方法A内中的一部分,只要报错A事务就会执行回滚


B方法的传播行为值为Propagation.REQUIRES_NEW时,第二种情况,报错在A方法

在这里插入图片描述

在这里插入图片描述

可以看出A方法报错进行了事务的回滚也不会影响到B方法,说明这两个方法处于不同的两个事务之中,Propagation.REQUIRES_NEW事务的传播行为相关,这个具体看参考文章,比较详细


报错在A方法,事务传播行为为其他值时,**Propagation.【REQUIRED|SUPPORTS|NESTED|MANDATORY】**时,方法B的事务失效,这个和事务的传播行为有关,相关解析请查看参考文章,比较详细

在这里插入图片描述

在这里插入图片描述


场景五:

  • 方法A和方法B不在同一个类下,@transcation只用在方法B上,A方法内调用B方法,B的事务正常,B报错会回滚B方法的操作,但是如果A在调用B之前已经对数据库进行的操作不会执行回滚

报错在B方法,B事务生效,B事务进行回滚,但不会对A方法调用B方法之前的操作进行回滚,即事务B只会对方法B生效。
为什么这个时候B方法的事务会生效?因为方法B不在和方法A同一个类中,方法A调用方法B是通过spring代理调用的,会被事务拦截到,具体解析请看参考文章

在这里插入图片描述

在这里插入图片描述


报错在A方法,B事务一样生效,效果和普通无事务的效果一样,B方法的值一样入库成功,但是注意B的事务是生效的

在这里插入图片描述

在这里插入图片描述

场景六:

  • 开启代理(@EnableAspectJAutoProxy(exposeProxy = true)),并暴露代理器(AopContext.currentProxy())能使第3点的方法B的事务生效(A和B在同一个类,A方法无事务,B方法有事务)

报错发生在方法B中,B事务生效,B事务进行回滚,不会对方法A调用方法B前的操作进行回滚,可以看到B事务是独立开的

在这里插入图片描述

报错发生在方法A中,B事务生效,数据一样能写入库中

在这里插入图片描述


场景七:

  • 方法的访问权限除了public外,其他权限都会使得@transcation事务失效。使用不同类中A方法无事务,B方法事务为new进行校验。
  • @Transactional 注解只能应用到 public 修饰的方法,因为是用cglib进行代理的,只能public,不然cglib无法进行代理,被aop增强的方法都应该是public的。(官网)

在这里插入图片描述

在这里插入图片描述


场景八:

  • Transaction rolled back because it has been marked as rollback-only
  • 方法B抛出异常,B是需要回滚的,方法Atry住希望A不进行回滚,但是会发现下面方法A还是执行了回滚。因为@Transactional
    默认值是REQUIRED,如果当前存在事务,则加入该事务,所以B和A是同一个事务。当B方法throw异常的时候,就会标志事务状态为rollback-only,但是A和B又是在同一个事务中,所以当A执行完进行commit时会发现事务状态为rollback-only,就会报错回滚。想不让方法A执行回滚,可以在方法B中使用事务传播行为REQUIRES_NEW,这样事务B和事务A分开,就不会出现这种问题。

方法A回滚

在这里插入图片描述
在这里插入图片描述

方法A不会滚

在这里插入图片描述


@Transactional 事务传播可选值

REQUIRED(默认值):如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。required(必须的)。
SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式继续运行。supports(支持的)
MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。mandatory(强制的)
REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。requires_new(依赖新的)
NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。not_supported(不支持的)
NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。never(从不)
NESTED:和 REQUIRED 效果一样。nested(嵌套)


@Transactional 事务隔离级别

DEFAULT(默认值):使用底层数据库默认的隔离级别。
READ_UNCOMMITTED:未提交读。无法防止。
READ_COMMITTED:可提交读。可以防止脏读。(RC)
REPEATABLE_READ:可重复读。可以防止脏读、可重复读。mysql 默认隔离级别。(RR)
SERIALIZABLE:串行事务。最高事务隔离级别,可以防止脏读、可重复读、幻读。


事务的执行原理、传播行为、事务隔离等级、相关的失效问题原因请参考下面的参考文章,比较详细
参考文章:

https://blog.csdn.net/jiaxiaoyan321/article/details/126752355
https://blog.csdn.net/wangmx1993328/article/details/89644934

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

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

相关文章

net6中使用FluentValidation做实体验证(批量注册)

实体验证-FluentValidation 首先明白两个概念 自动验证:就是在请求进入到控制器前FluentValidation就自行完成实体的验证并做错误返回, 优点:简单 少一些手动调用的代码缺点:灵活性差,不好控制,不支持异步…

智慧校园电子班牌系统

智慧电子班牌区别于传统电子班牌,智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌,一般安装于教室门口,用来实时显示学校通知、班级通知,可设置集中分布式管理,…

RSA加解密简单实现

目录 浅谈加解密实现方式 MD5加密 DES加密 AES加密 RSA加密 SSL加密认证 关于RSA加解密实现 简单数据加解密的实现 分块加解密实现 附录 浅谈加解密实现方式 关于数据加解密方式,我们一般分为不可逆加密、对称可逆加密、非对称加密、综合加密应用等&…

魔改并封装 YoloV5 Version7 的 detect.py 成 API接口以供 python 程序使用

文章目录IntroductionSection 1 起因Section 2 魔改的思路Section 3 代码Part 1 参数部分Part 2 识别 APIPart 3 完整的 DetectAPI.pyPart 4 修改 dataloaders.pySection 4 调用ReferenceIntroduction YoloV5 作为 YoloV4 之后的改进型,在算法上做出了优化&#xf…

errgroup 原理简析

golang.org/x/sync/errgroup errgroup提供了一组并行任务中错误采集的方案。 先看注释 Package errgroup provides synchronization, error propagation, and Context cancelation for groups of goroutines working on subtasks of a common task. Group 结构体 // A Gro…

Sphinx : 高性能SQL全文检索引擎

Sphinx是一款基于SQL的高性能全文检索引擎,Sphinx的性能在众多全文检索引擎中也是数一数二的,利用Sphinx,我们可以完成比数据库本身更专业的搜索功能,而且可以有很多针对性的性能优化。 Sphinx的特点 快速创建索引:3分…

Barra模型因子的构建及应用系列三之Momentum因子

一、摘要 在之前的Barra模型系列文章中,我们已经初步讲解、构建了Size因子和Beta因子,并分别创建了对应的单因子策略。通过回测发现,其中Size因子的小市值效应具有很强的收益能力。而本篇文章将在该系列下进一步构建Momentum因子。 二、模型…

90%企业在探索的敏捷开发怎么做?极狐GitLab总结了这些逻辑与流程

本文来自: 彭亮 极狐(GitLab) 高级产品经理 毛超 极狐(GitLab) 研发工程师 极狐(GitLab) 市场部内容团队 “敏捷” 是指能够驾驭变化,保持组织竞争优势的一种能力。自 2001 年《敏捷宣言》以来,敏捷及敏捷开发理念逐渐席卷全球。中国信通院《…

面试已上岸,成功拿到阿里和腾讯的入职offer,Java程序员面经全在这了,希望能帮到你!

前言 一开始的时候简历海投大多数都被拒绝了,后来自己找在腾讯上班的朋友帮忙改了一下简历,果然不一样了大多都能拿到面试机会,当然拿到后也没有那么顺利,面了差不多有十几家公司的样子,大大小小的都有,其中…

C++和QML混合编程_QML发送信号到C++端(信号和槽绑定)

C和QML混合编程_QML发送信号到C端(信号和槽绑定) 前言: 下面是之前讲解过的三种方法 1、使用Q_INVOKABLE声明一下普通函数,在QML端可以直接调用 2、使用Connections绑定QML的信号和C端的槽函数 3、使用connect绑定QML的信号和C端的…

通俗易懂理解——布隆过滤器

文章目录概述本质优缺点优点:缺点:实际应用解决redis缓存穿透问题:概述 本质 本质:很长的二进制向量(数组) 主要作用:判断一个数据在这个数组中是否存在,如果不存在为0&#xff0c…

NR PDCP duplication

欢迎关注同名微信公众号“modem协议笔记”。 PDCP duplication 是PDCP 的一个功能,主要是为满足URLLC 场景的可靠性/延迟要求,而产生的一种提高传输可靠性的机制,具体就是在信号状况比较差的情况下,网络侧通过配置PDCP duplicati…

集中式存储和分布式存储

分布式存储是相对于集中式存储来说的,在介绍分布式存储之前,我们先看看什么是集中式存储。不久之前,企业级的存储设备都是集中式存储。所谓集中式存储,从概念上可以看出来是具有集中性的,也就是整个存储是集中在一个系…

Zynq非Video Mixer方案实现视频叠加输出,无需SDK配置,提供工程源码和技术支持

目录1、前言2、Video Mixer的不便之处3、FDMA取代Video Mixer实现视频叠加输出4、Vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 关于Zynq使用Video Mixer方案实现视频叠加输出方案请参考点击查看:Video Mixer方案 对于Zynq和Micr…

Elasticsearch:Security API 介绍

在我之前的文章 “Elasticsearch:运用 API 创建 roles 及 users” ,我展示了如何使用 Security API 来创建用户及角色来控制访问 Elasticsearch 中的索引。在今天的文章中,我将展示一个使用 Security API 来创建一个用户及角色来访问一个索引…

双指针【灵神基础精讲】

来源0x3f:https://space.bilibili.com/206214 文章目录同向双指针[209. 长度最小的子数组](https://leetcode.cn/problems/minimum-size-subarray-sum/)[713. 乘积小于 K 的子数组](https://leetcode.cn/problems/subarray-product-less-than-k/)[3. 无重复字符的最…

计算机相关专业毕业论文选题推荐

计算机科学以下是我推荐的20个计算机科学专业的本科论文选题:基于机器学习的推荐算法研究与实现基于区块链技术的数字身份认证方案设计与实现基于深度学习的图像识别技术研究与应用基于虚拟现实技术的教育培训平台设计与实现基于物联网技术的智能家居系统研究与开发…

Dubbo与Spring Cloud优缺点分析(文档学习个人理解)

文章目录核心部件1、总体框架1.1 Dubbo 核心部件如下1.2 Spring Cloud 总体架构2、微服务架构核心要素3、通讯协议3.1 Dubbo3.2 Spring Cloud3.3 性能比较4、服务依赖方式4.1 Dubbo4.2 Spring Cloud5、组件运行流程5.1 Dubbo5.2 Dubbo 运行组件5.3 Spring Cloud5.4 Spring Clou…

[数据治理-02]一个例子搞懂元数据、参考数据、主数据、交易数据...的关系

杜威说过“所有知识都是分类”!很好理解,分类是认知经济,任何有效分类,都可以极大地节省我们的认知精力。谈到数据就必须做个分类,谈到数据分类可以从多个维度出发,比如按业务维度、这是财务数据、那是人力…

C++ ——多态 下 (图解多态原理、虚函数的再认知)

目录 一、抽象类 1)抽象类定义 2)抽象类的继承 3)抽象类实现多态 4)抽象类的好处 二、多态的实现原理 1)虚函数的存储方式 2)子类中虚函数的存储方式 ① 子类将基类中的虚表原封不动的拷贝到自己的…