【Spring】Spring事务失效问题

📫作者简介:小明java问道之路2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。

        

🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人

🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术

本文目录

本文导读

一、Spring事务失效问题

1、访问权限问题

2、方法用final修饰

3、方法内部调用

4、未被spring管理

5、表不支持事务

6、多线程调用

7、未开启事务

二、事务不回滚问题解析

1、错误的传播特性

2、try...catch了异常

3、手动抛了别的异常

4、自定义回滚异常

总结


本文导读

Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。

一、Spring事务失效问题

1、访问权限问题

事务方法被定义成了private,这样会导致事务失效,spring要求被代理方法必须是public的。

在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。

也就是说,如果我们自定义的事务方法(即目标方法),它的访问权限不是public,而是private、default或protected的话,spring则不会提供事务功能

2、方法用final修饰

事务方法被定义成了final的,这样会导致事务失效。

spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。

3、方法内部调用

在某个Service类的某个方法中,调用另外一个事务方法。拥有事务的能力是因为spring aop生成代理了对象,但是这种方法直接调用了this对象的方法,所以不会生成事务,在同一个类中的方法直接内部调用,会导致事务失效。

解决方案:Service类中注入自己(@Autowired prvate ServiceA serviceA;)、新加一个Service类

4、未被spring管理

没加Controller、@Service、@Component、@Repository等注解

5、表不支持事务

6、多线程调用

两个方法不在同一个线程中(生成嵌套的线程),从而是两个不同的事务。

如果看过spring事务源码的朋友,可能会知道spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接。

7、未开启事务

springboot通过DataSourceTransactionManagerAutoConfiguration类,已经默默的帮你开启了事务。

如果使用spring项目,则需要在applicationContext.xml文件中,手动配置事务相关参数,如果没配置,事务不会生效的。

二、事务不回滚问题解析

1、错误的传播特性

在使用@Transactional注解时可以指定propagation参数的,spring目前支持7种传播特性

NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常

REQUIRED,REQUIRES_NEW,NESTED三种传播特性才会创建新事务

2、try...catch了异常

3、手动抛了别的异常

spring事务默认情况下只会回滚RuntimeException和Error,对于普通的Exception,它不会回滚。

4、自定义回滚异常

例如(@Transactional(rollbackFor = BusinessException.class)),抛的其他异常不会回滚

总结

Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。

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

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

相关文章

C/C++---------------LeetCode第229. 多数元素 II

多数元素|| 题目及要求哈希算法 题目及要求 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 示例 1: 输入:nums [3,2,3] 输出:[3] 示例 2: 输入:nums [1] 输出:…

基于uniapp+vue微信小程序的健康饮食管理系统 907m6

设计这个微信小程序系统能使用户实现不需出门就可以在手机或电脑前进行网上查询美食信息、 运动视频等功能。 本系统由用户和管理员两大模块组成。用户界面显示在应用程序中,管理员界面显示在后台服务中,通过小程序端与服务端间进行数据交互与数据传输实…

自建CA实战之 《0x03 代码签名》

自建CA实战之 《0x03 代码签名》 本文针对Windows平台,介绍如何使用自建CA来签发代码签名证书。 之前的文章中,我们介绍了如何自建CA,以及如何使用自建CA来签发Web服务器证书、客户端证书。 本文将介绍如何使用自建CA来签发代码签名证书。…

MYSQL中DML、DDL常用语句记录

MYSQL中DML、DDL常用语句记录 DML 在 MySQL 中,DML (Data Manipulation Language) 是一类用于查询和操作数据的 SQL 语句。以下是常用的 DML 语句: 1、SELECT SELECT 语句用于查询数据库中的数据。语法如下: SELECT column1, column2, .…

Kafka(一)在WSL单机搭建Kafka伪集群

目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…

文本转语音:微软语音合成标记语言 (SSML) 文本结构和事件

​ SSML 的语音服务实现基于万维网联合会的语音合成标记语言版本 1.0。 ​ 语音服务支持的元素可能与 W3C 标准不同。 每个 SSML 文档是使用 SSML 元素(或标记)创建的。 这些元素用于调整语音、风格、音节、韵律、音量等。 下面是 SSML 文档的基本结构…

【Linux常用命令】-文件写入相关

一、rm命令,文件删除 1.相关参数 -f(–force):强制删除文件或目录,无需确认。 -r(–recursive):递归地删除目录及其内容。 -i(–interactive):交…

ultrascale FPGA

1.工艺从mos到FIN,查了半天资料,不如bili的intel介绍视频,其实是把DS做成3D结构,减小DS漏电流; 2.型号的尾数是以百万门为标定的; 3.slice(切片)是CLB的组成单元,slice又包含LUT&a…

CANdelaStudio 使用教程5 编辑DID

文章目录 在哪编辑DID的分类编辑快照数据添加 DID 在哪编辑 DID的分类 编辑快照数据 添加 DID

Linux C语言 26-可变参数

Linux C语言 26-可变参数 本节关键字:可变参数、va_list、va_arg、va_end 相关C库函数:va_list、va_arg、va_end 什么是可变参数? C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时,使用“char *format, …

async函数和await关键字

async写在一个函数a前面,该函数变为异步函数,可在里面使用await关键字,await后面一般跟一个promise对象(axios函数返回一个promise对象,里面有异步任务),await会原地等待该异步任务结果&#xf…

单细胞seurat入门—— 从原始数据到表达矩阵

根据所使用的建库方法,单细胞的RNA序列(也称为读取(reads)或标签(tags))将从转录本的3端(或5端)(10X Genomics,CEL-seq2,Drop-seq&…

枚举的第一行

2023年11月26日 问题: 好奇enum的所声明的枚举类的第一行是什么 从java技术卷1中第五章5.6中,了解是枚举类的实例 验证 错误信息: 解释: 此时只有有参构造 在这个枚举类里不能使用空,大概意思是说不能使用空参创建实例 校验 在原有的基础上创建一个无参构造 结果:不再报错,第…

c语言练习12周(11~15)

编写double fun(int a[],int n)函数,计算返回评分数组a中,n个评委打分,去掉一个最高分去掉一个最低分之后的平均分 题干编写double fun(int a[],int n)函数,计算返回评分数组a中,n个评委打分,去掉一…

php.ini文件中XDebug的配置

[XDebug] zend_extension"G:/php/ext/php_xdebug.dll" xdebug.mode debug xdebug.start_with_request trigger 其中G:/php/ext/php_xdebug.dll为xdebug.dll的文件路径。 原文件格式类似于 php_xdebug-3.3.0alpha3-8.2-vs16-x86_64.dll xdebug官网 Xdebug - Debu…

【教学类-06-13】20231126 (55格版)趣味题(一)1-9加法题(10倍)(整十相加)

作品展示 背景需求: 1、会做加法题的孩子5分钟内完成题目,太快了,所以为了拉平差异,需要给这些会做另外的题目,比如提供一些他们没有做过的“趣味题形”。 2、好多次,听见大班孩子在互相“考试”——“老…

CSS常用笔记

1. 脱离文档流&#xff0c;用于微调 {position: relative; top: 10px; right: 0; } 2. flex布局大法 <div class"demo"><div class"demo-1"></div><div class"demo-2"></div><div class"demo-3"&…

从源码重新真正认识RateLimiter(SmoothBursty实现)

前言 相信大家对于谷歌RateLimiter一定并不陌生,在项目中应该也经常拿来进行限流&#xff0c;但是对于其实现原理并不一定能用熟于心&#xff0c;本文带大家从源码探究RateLimiter的设计与具体实现。 RateLimiter的组成 从源码可以看到&#xff0c;RateLimiter由stopwatch与m…

27、Nuxt.js项目整合ElementUI组件库

参考element-ui官网安装组件库 项目中新建插件引入element-ui plugins\element-ui.js import Vue from vue; import ElementUI from element-ui;Vue.use(ElementUI);nuxt.config.js plugins: ["/plugins/element-ui.js"],build: {// 将位于 node_modules 目录下的…

【go语言实现一个webSocket的一个demo】

go语言实现一个webSocket的一个demo 前端代码 <html lang"zh-CN"><head></head><body> <script type"text/javascript">// header(Access-Control-Allow-Origin:*);var sock null;var wsuri "ws://127.0.0.1:9999&…