Spring事务失效可能是哪些原因

典型回答

Spring中比较容易失效的就是通过@Transactional 定义的声明式事务,他在以下几个场景中会导致事务失效,首先,就是Spring的@Transactional是基于Spring的AOP机制实现的,而AOP机制又是基于动态代理实现的。那么如果代理失效了,事务也就会失效。

代理失效的情况

主要就是分为类的内部调用、final方法、static方法等。
所以就是以下几种情况就会失效:
1、@Transactional应用在非 public 修饰的方法上

public class Myservice {@Transactionalprivate void doInternal(){System.out.println("Doing internal work...");}
}

private方法,只会在当前对象中的其他方法中调用,也就是会进行对象的自调用,这种情况是用this调用的,并不会走到代理对象,而@Transactional是基于动态代理实现的,所以代理会失效。
2、同一个类中方法调用,导致@Transactional失效

public class Myservice{public void dosomething(){doInternal();//自调用方法}@Transactionalpublic void doInternal(){System.out.println("Doing internal work...");}
}

以上,和private是一回事,因为没办法走到代理服务,所以事务会失效。
3、final、static方法

由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。

还有就是调用static方法,因为这类方法是属于这个类的,并不是对象的,所以无法被AOP.

@Transactional用的不对

1、@Transactional 注解属性 propagation 设置错误

@service
public class Exampleservice{@Autowiredprivate ExampleRepository repository;@Transactional(propagation =Propagation.NOT SUPPORTED)public void methodA(){repository.someDatabaseoperation();}
public void methodB(){repository.anotherDatabase0peration);}
}@servicepublic class Someservice{@Autowiredprivate Exampleservice exampleservice;@Transactionalpublic void dosomething(){// 这里执行一些业务逻辑exampleservice.methodA();//这个方法由于 NOT SUPPORTED 属性,会在非事务下执行exampleservice.methodB();//...}
}

以上,如果事务发生回滚,则methodA并不会回滚。因为他的propagation事不支持事务,那么他就不会一起回滚。
2、@Transactional 注解属性 rollbackFor 设置错误

public class MyService{@Transactional(rollbackFor =RuntimeException.class)private void doInternal(){System.out.println("Doing internal work...);}
}

以上,如果发生非RuntimeException,则事务不会回滚,那么就会导致事务失效。所以需要指定为(rollbackFor =Exception.class)

3、用错注解
有的时候,你排查了很久,发现都没问题,但是还是不生效,然后找别人来帮你看,他上来就看了一下你用的@Transactional,发现并不是Spring中的,而是其他什么地方的,比如 javax.transaction.Transactional ,这样也会导致事务失效。

异常被捕获

异常被catch捕获导致@Transactional失效

public class MyService{@Transactionalpublic void dosomething(){try{doInternal();}catch(Exception e){logger.error(e);}}
}

因为异常被捕获,所以就没办法基于异常进行rolback了,所以事务会失效。

事务中用了多线程

@Transactional 的事务管理使用的是 ThreadLocal 机制来存储事务上下文,而 ThreadLocal 变量是线程隔离的,即每个线程都有自己的事务上下文副本。因此,在多线程环境下,Spring 的声明式事务会失效,即新线程中的操作不会被包含在原有的事务中。

数据库引擎不支持事务

这个好理解,如myisam,不支持的肯定就不行了。

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

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

相关文章

ArrayList与顺序表(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x1…

归并排序精讲

一.定义 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子…

C++ 虚表起源

本文会让看不见 摸不着的虚表(Vtable),虚指针(Vptr)彻底现行 本文涉及思想: C 面向对象 封装 继承 多态 中的 多态 概念解释: 虚表指针: 这是指向虚表(vtable)的指针,虚表中包含了该类的所有虚函数对应的地址。 虚表&#x…

外贸客户开发有用的软件

外贸客户开发过程中,选择合适的软件工具能够显著提升效率和效果。以下是一些对外贸客户开发非常有用的软件: CRM系统: Salesforce:全球领先的CRM平台,提供强大的客户关系管理、市场分析、销售自动化等功能,…

vue基础语法学习

Object.defineProperty方法的使用 // 这是一个普通的对象 let phone {} // 给这个phone新增一个属性 三个参数:新增属性的对象,新增啥属性,属性值,key value对 Object.defineProperty(phone,color,{value:太空灰, //设置属性值wr…

联合概率、条件概率、边缘概率、贝叶斯定理

事件 事件是实现的一组结果(一个或多个)。就像"扔硬币时反面是事件",“从一副纸牌中选择国王(国王中的任何一个)也是事件”, “roll到5是事件等” 独立每个事件均不受其他事件影响。例: 抛硬币两次。第一次扔事件的结果不会影响第二个事件结果 相关(也…

Axure糖尿病健康管理APP原型 (知识科普/病友社区/远程医生会诊/购物商城/血糖监测/饮食监测)

作品概况 页面数量:共 50 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 应用领域:医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图,设计规范内容清晰…

深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)

目录 成员函数种类 虚函数的实现 单一继承下的虚函数 接下来我将持续更新“深度解读《深度探索C对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,或文章末尾扫描二维码,自动获得推文…

邮件接口的安全性如何保障?如何有效使用?

邮件接口故障时如何处理?怎么设置和配置邮件接口? 邮件接口作为企业内外部沟通的重要桥梁,其安全性显得尤为重要。那么,邮件接口的安全问题如何保障。AokSend将深入探讨如何保障邮件接口的安全性,确保企业信息的安全传…

什么是仪器校准报告?

在科学实验和工业生产中,仪器是一种非常重要的辅助工具,无论是测量数据、控制实验进程还是保证产品质量,仪器都发挥着至关重要的作用。为了确保仪器的准确性和稳定性,仪器校准报告这一概念应运而生。本文给大家详细介绍仪器校准报…

科研基础与工具(论文写作)

免责申明: 本文内容只是学习笔记,不代表个人观点,希望各位看官自行甄别 参考文献 科研基础与工具(YouTube) 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候,不不知道怎么…

简单使用Web3.js

随着区块链技术的快速发展,以太坊(Ethereum)作为其中的佼佼者,为开发者们提供了一个构建去中心化应用的强大平台。为了更轻松地与以太坊区块链进行交互,我们需要一个强大的工具,而Web3.js正是这样一个工具。…

速盾:cdn原理图解

CDN(Content Delivery Network)是一种分布式计算机网络系统,主要用于提供快速、可靠的网页内容传输服务。CDN的核心原理是将网站的静态资源(如图片、视频、音频文件等)复制到多个地理位置的服务器上,并通过…

【Linux】IO多路转接技术Epoll的使用

【Linux】IO多路转接技术Epoll的使用 文章目录 【Linux】IO多路转接技术Epoll的使用前言正文接口介绍工作原理LT模式与ET模式边缘触发(ET)水平触发(LT) 理解ET模式和非阻塞文件描述符ET模式epoll实现TCP服务器简单地封装epoll系统…

【软件测试】认识测试|测试岗位|软件测试和开发的区别|优秀的测试人员需要具备的素质

一、什么是测试 测试在⽣活中处处可⻅ 1.生活中的测试场景 案例⼀:对某款购物软件进⾏测试 *启动测试:点击软件图标,测试软件是否可以正常打开 搜索测试:点击输入框,输入关键词,点击搜索 商品测试&#…

给c++小白的教程4:运算

大家好,又见面了! 本次所说的运算将包括 算术运算符位运算符赋值运算符 算术运算符 算术运算符,顾名思义,就是用来支持数字运算的符号。 像什么加减乘除啦,取模啦,都是算术运算符 假设变量 A 的值为 10&#xff…

【数据结构】图论(图的储存方式,图的遍历算法DFS和BFS、图的遍历算法的应用、图的连通性问题)

目录 图论一、 图的基本概念和术语二、图的存储结构1. 数组(邻接矩阵)存储表示无向图的数组(邻接矩阵)存储表示有向图的数组(邻接矩阵)存储表示 邻接表存储表示有向图的十字链表存储表示无向图的邻接多重表存储表示 三、图的遍历算法图的遍历——深度优先搜索(DFS&a…

.net core webapi 添加日志管理看板LogDashboard

.net core webapi 添加日志管理看板LogDashboard 添加权限管理&#xff1a; 我们用的是Nlog文件来配置 <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http:/…

软考高项(已通过,E类人才)-学习笔记材料梳理汇总

软考高项&#xff0c;即软考高级信息系统项目管理师&#xff0c;全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试中的高级水平测试。适用于从事计算机应用技术、软件、网络、信息系统和信息服务等领域的专业人员&#xff0c;以及各级企业管理人员和从事项目…

Netty学习——实战篇7 ProtoBuf实战-多类型数据

1 需求&#xff1a; 1、客户端可以随机发送Student POJO 、Worker POJO 对象到服务器(通过protobuf编码) 2、服务端能接收 Student POJO 、Worker POJO 对象(需要判断是哪种类型)&#xff0c;并显示信息(通过ProtoBuf解码) 2 开发 2.1 编写proto文件 MyDate.proto syntax &…