当前位置: 首页 > news >正文

Spring事务失效原因分析解决

文章目录

  • 1、方法内部调用
  • 2、修饰符
  • 3、非运行时异常
  • 4、try…catch捕获异常
  • 5、多线程调用
  • 6、同时使用@Transactional和@Async
  • 7、错误使用事务传播行为
  • 8、使用的数据库不支持事务
  • 9、是否开启事务支持

在工作中,经常会碰到一些事务失效的坑,基于遇到的情况,以及了解到的坑,写了本篇文章与大家学习交流~

1、方法内部调用

非事务方法调用事务方法会出现问题

@Autowired
private KsAService ksAService;public void add() {this.doAdd();
}@Transactional
public void doAdd() {KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);int res = 1 / 0;
}

原因:Spring声明式事务是基于动态代理(AOP)实现的对bean的管理和切片,为我们每个class生成代理对象,只有代理对象之间调用,才会触发切面逻辑,方法A调用方法B,这里的ksAService是真实对象,不是代理对象

解决:

  • add方法加上注解@Transactional
  • doAdd方法中使用代理对象来调用
    @Transactional
    public void doAdd() {KsA ksA = new KsA();ksA.setName("forlan");KsAService ksAService =(KsAService) AopContext.currentProxy();ksAService.insert(ksA);int res = 1 / 0;
    }
    

2、修饰符

@Transactional
private void doAdd() {KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);int res = 1 / 0;
}

原因:Spring声明式事务是基于动态代理实现

  • 非public修饰,不能被代理
  • static修饰的方法属于类,不属于对象,不能被重写,不能被代理
  • final修饰的方法不能被重写,不能被代理

解决:不使用这些修饰符,非public、static、final

  • static、final,代理里面一般有提示,Methods annotated with ‘@Transactional’ must be overridable
  • 注意不要使用非public修饰,特别是private,我们很习惯性写成这个

3、非运行时异常

@Transactional
public void doAdd() throws IOException{KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);throw new IOException();
}

原因:使用Spring的@Transactiona开启事务,默认Error和RuntimeException及其子类才会回滚
解决:指定异常回滚@Transactional(rollbackFor = Exception.class)

4、try…catch捕获异常

@Transactional
public void doAdd() throws RuntimeException {KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);try {int res = 1 / 0;} catch (Exception e) {// 抛出异常// 设置手动回滚}
}

原因:自己捕获了异常,则事务无法感知

解决:

  • 抛出异常:throw new RuntimeException(e.getMessage());
  • 设置手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

5、多线程调用

@Transactional
public void doAdd() {new Thread(() -> {KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);}).start();int res = 1 / 0;
}

原因:因为Spring的事务是通过数据库连接来实现不同线程使用不同的数据库连接,放在ThreadLocal中,基于同一数据库连接的事务才能同时提交或回滚,多线程场景下,拿到的数据库连接是不一样的
解决:

  • 分布式事务保证
  • 自己实现事务回滚

6、同时使用@Transactional和@Async

A类事务方法调用B类异步方法

public class A{@Transactionalpublic void add() {KsA ksA = new KsA();ksA.setName("forlan");ksAService.insert(ksA);}
}public class B{@Asyncpublic void insert(KsA ksA) {this.ksADao.insert(ksA);int res = 1 / 0;}
}

原因:同多线程调用问题类似,异步方法属于开启一个新线程执行了
解决:

  • 异步方法加上@Transactional

7、错误使用事务传播行为

具体可以了解 Spring事务传播行为实战

比如:使用了@Transactional(propagation = Propagation.NOT_SUPPORTED),(不支持事务)如果当前存在事务,就把当前事务挂起

8、使用的数据库不支持事务

比如,MySQL中的MyISAM,是不支持事务的
原因:Spring事务基于数据库事务实现

9、是否开启事务支持

我们使用的SpringBoot默认开启事务支持了,通过我们引入的依赖jar包,可以发现@EnableTransactionManagement

相关文章:

Spring事务失效原因分析解决

文章目录1、方法内部调用2、修饰符3、非运行时异常4、try…catch捕获异常5、多线程调用6、同时使用Transactional和Async7、错误使用事务传播行为8、使用的数据库不支持事务9、是否开启事务支持在工作中,经常会碰到一些事务失效的坑,基于遇到的情况&…...

4个月的测试经验,来面试就开口要17K,面试完,我连5K都不想给他.....

2021年8月份我入职了深圳某家创业公司,刚入职还是很兴奋的,到公司一看我傻了,公司除了我一个测试,公司的开发人员就只有3个前端2个后端还有2个UI,在粗略了解公司的业务后才发现是一个从零开始的项目,目前啥…...

python学习之pyecharts库的使用总结

pyecharts官方文档:https://pyecharts.org//#/zh-cn/ 【1】Timeline 其是一个时间轴组件,如下图红框所示,当点击红色箭头指向的“播放”按钮时,会呈现动画形式展示每一年的数据变化。 data格式为DataFrame,数据如下图…...

【taichi】利用 taichi 编写深度学习算子 —— 以提取右上三角阵为例

本文以取 (bs, n, n) 张量的右上三角阵并展平为向量 (bs, n*(n1)//2)) 为例,展示如何用 taichi 编写深度学习算子。 如图,要把形状为 (bs,n,n)(bs,n,n)(bs,n,n) 的张量,转化为 (bs,n(n1)2)(bs,\frac{n(n1)}{2})(bs,2n(n1)​) 的向量。我们先写…...

二进制 k8s 集群下线 worker 组件流程分析和实践

文章目录[toc]事出因果个人思路准备实践当前 worker 节点信息将节点标记为不可调度驱逐节点 pod将 worker 节点从 k8s 集群踢出下线 worker 节点相关组件事出因果 因为之前写了一篇 二进制 k8s 集群下线 master 组件流程分析和实践,所以索性再写一个 worker 节点的缩…...

Bean的六种作用域

限定程序中变量的可用范围叫做作用域,Bean对象的作用域是指Bean对象在Spring整个框架中的某种行为模式~~ Bean对象的六种作用域: singleton:单例作用域(默认) prototype:原型作用域(多例作用域…...

Http发展历史

1 缘起 有一次,听到有人在议论招聘面试的人员, 谈及应聘人员的知识深度,说:问了一些关于Http的问题,如Http相关结构、网络结构等, 然后又说,问没问相关原理、来源? 我也是有些困惑了…...

高级Java程序员必备的技术点,你会了吗?

很多程序员在入行之后的前一两年,快速学习到了做项目常用的各种技术之后,便进入了技术很难寸进的平台期。反正手里掌握的一些技术对于应付普通项目来说,足够用了。因此也会缺入停滞,最终随着年龄的增长,竞争力不断下降…...

【暴力量化】查找最优均线

搜索逻辑 代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力: 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑: 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数: 小于6日均线,用金叉或…...

Java读取mysql导入的文件时中文字段出现�??的乱码如何解决

今天在写程序时遇到了一个乱码问题,困扰了好久,事情是这样的, 在Mapper层编写了查询语句,然后服务处调用,结果控制器返回一堆乱码 然后查看数据源头处: 由重新更改解码的字符集,在数据库中是正…...

k8s核心概念—Pod Controller Service介绍——20230213

文章目录一、Pod1. pod概述2. pod存在意义3. Pod实现机制4. pod镜像拉取策略5. pod资源限制6. pod重启机制7. pod健康检查8. 创建pod流程9. pod调度二、Controller1. 什么是Controller2. Pod和Controller关系3. deployment应用场景4. 使用deployment部署应用(yaml&a…...

Tensorflow的数学基础

Tensorflow的数学基础 在构建一个基本的TensorFlow程序之前,关键是要掌握TensorFlow所需的数学思想。任何机器学习算法的核心都被认为是数学。某种机器学习算法的策略或解决方案是借助于关键的数学原理建立的。让我们深入了解一下TensorFlow的数学基础。 Scalar 标…...

IT培训就是“包就业”吗?内行人这么看

大部分人毕业后选择参加职业技能培训,都是为了学完之后能找到好工作,而“就业服务”也成为各家培训机构对外宣传的重点内容。那么,所谓的“就业服务”就是“包就业”和“包底薪”吗?学完就一定能拿到offer吗?今天&…...

【算法】【数组与矩阵模块】顺时针旋转打印矩阵

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...

Java中的锁概述

java中的锁java添加锁的两种方式:synchronized:关键字 修饰代码块,方法 自动获取锁、自动释放锁Reentrantlock:类 只能修饰代码块 手动加锁、释放锁java中锁的名词一些锁的名词指的是锁的特性,设计,状态&am…...

微电影行业痛点解决方案

在当下新媒体时代,微电影作为“微文化”的载体,具有“微”的特点,经过短短数年的快速发展,并获得了受众广泛的关注和喜爱,对人们的休闲娱乐方式也产生较大的影响。但在迅猛发展的同时也存在一些行业痛点,诸…...

使用Spring框架的好处是什么

使用Spring框架的好处是什么? 1、轻量:Spring 是轻量的,基本的版本大约2MB。 2、控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 3、面向切面的编程(AOP…...

【表格单元格可编辑】vue-elementul简单实现table表格点击单元格可编辑,点击单元格变成弹框修改数据

前言 这是继我另一个帖子就是单元格点击变成输入框后添加的功能 因为考虑到有些时候修改单元格的信息可能点击后要修改很多,那一个输入框不好用 所以这时候就需要一个弹框可以把所有表单都显示出来修改 所以这里就专门又写了一个demo,用于处理这种情况 …...

vue3.0 响应式数据

目录1.什么是响应式2. 选项式 API 的响应式数据3.组合式 API 的响应式数据3.1 reactive() 函数3.2 toref() 函数3.3 toRefs() 函数3.4ref() 函数总结1.什么是响应式 这个术语在今天的各种编程讨论中经常出现,但人们说它的时候究竟是想表达什么意思呢?本质…...

uni-app ①

文章目录一、uni-app简介学习 uniapp 本质uniapp 优势uni-app 和 vue 的关系uni-app 和小程序有什么关系uniapp 与 web 代码编写区别课程内容学习重点知识点一、uni-app 简介 uni-app 是一个使用 Vue.js 进行 开发所有前端应用的框架。开发者编写一套代码,即可发布…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【网络安全】开源系统getshell漏洞挖掘

审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...