当前位置: 首页 > 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 进行 开发所有前端应用的框架。开发者编写一套代码,即可发布…...

20个 Git 命令玩转版本控制

想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用。Git 是一个版本控制系统,可以帮助开发人员跟踪修订、识别文件版本,并在必要的时候恢复旧版本。Git 对于有一定编程经验的用户来说虽然不算太难,但是想要…...

SAP NetWeaver版本和SAP Kernel版本的确定

SAP NetWeaver(SAP NW)描述了用于“业务启用”的所有软件和服务。SAP业务套件(如ERP中央组件(ECC)或供应商关系管理(SRM))包含该特定业务解决方案的软件组件。 以下是SAP NetWeaver…...

面试23K字节测试开发岗被血虐,到底具有怎样的技术才算高级水平?

前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了6年软件测试。。。 下面这条招聘是在腾讯招聘官网截图下来的,首先我们对高级水平下一个定义吧,那它应该是对标这个职级该有的能力 什么样的工程师才能算高级?至少…...

智云通CRM:买对了吗——大客户采购的方案实施

一旦采购合同签署后,供应商就要履行合同,按时交付产品进场使用,或实施服务方案。不过,无论对供应商还是客户来说,双方的合作并没有就此结束。 在这个阶段,客户会评估此次合作的供应商做事是否靠谱&#x…...

前后端开发过程中的跨域问题总结

1.何为跨域问题 出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能不能使用。可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。…...

爬虫:栖落的电影网站,利用requests和re模块

这是栖落的电影网站地址:https://xxx.xxx 进入网页,显示: 爬取目标:电影的名称、观影人数和评分。 易知本网站的url url "https://xxx.xxx" 本网站会识别出headers中的python请求而拒绝访问,所以需要更改…...

使用burpsuite抓包 + sql工具注入 dvwa靶场

使用burpsuite抓包 sql工具注入 dvwa靶场 记录一下自己重新开始学习web安全之路②。 一、准备工作 1.工具准备 sqlmap burpsuite 2.浏览器准备 火狐浏览器 设置代理。 首先,先设置一下火狐浏览器的代理 http代理地址为127.0.0.0.1 ,端口为8080 …...

树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次

一、AcWing 846. 树的重心1.1题目1.2思路分析题意:什么是树的重心?树的重心是指,删除某个结点后剩下的最大连通子树的结点数目最小,如下图是根据样列生成的树,若删除结点1,则剩下三个子树最大的是中间那颗结…...

从零开始学数据分析之数据分析概述

当今世界对信息技术的依赖程度在不断加深,每天都会有大量的数据产生,我们经常会感到数据越来越多,但是要从中发现有价值的信息却越来越难。 这里所说的信息,可以理解为对数据集处理之后的结果,是从数据集中提炼出的可…...

十五载厚积薄发,电信级分布式数据库是这样炼成

所在论坛:数据库技术创新&云原生论坛 分享时段:2.18 10:00-10:30 分享主题:大规模并行处理:AntDB分布式演进之路 分享嘉宾:沈夺,亚信科技AntDB数据库内核开发工程师 由中国开源软件推进联盟Postgre…...

通江县网站建设/旅游搜索量环比增188%

关键设置: 第一步(SQL2005、SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Server 配置管理器-->SQL Server网络配置-->MSSQLSERVER(这个名称以具体实例名为准) 的协议-->TCP/IP-->右键-->…...

网站开发的收入/今天全国31个省疫情最新消息

从开机到安装Tensorflow全过程(Windows版本)如题目所示,所需要的前置准备是: 一台电脑; 可以上网的环境; 您(认字就好); 现在我们开始吧!首先,打…...

织梦网站模板做的网站有哪些/最快的新闻发布平台

1. 安装 vue-devtools 调试工具 vue 官方提供的 vue-devtools 调试工具,能够方便开发者对 vue 项目进行调试与开发。 Chrome 浏览器在线安装 vue-devtools :https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajb…...

网站 翻页 实现/seo关键词优化排名外包

bitsCN.commysql-utilities工具体验我主要体验了下几个关于REPLICATION的工具。先说下我的环境:MASTER: 192.168.1.131SLAVE: 192.168.1.132, 192.168.1.133三台DB都有对外的ALL权限用户。各个配置文件如下,[sql][rootmysql56-master home]# cat /etc/my…...

重庆做商城网站建设/衡水seo营销

隐藏页面元素主要使用style 的display/visibility属性或者调用hide()方法 1&#xff1a;隐藏后不占位&#xff0c;后面的元素补上前面元素的位置&#xff0c;影响后面页面的布局 style“display: none;” //隐藏 document.getElementById(“demo”).style.display“none” <…...

邯郸做网站最好的公司/郑州专业seo首选

公司就一个苹果开发者账号,项目接入交付,人员来来往往,很快就将100台设备名额占满. 移除测试设备有下面两种方式: 1.等待新的会员年 续费开发者账号后,苹果会提供一次更新设备列表的机会. 2.向苹果请求更新设备列表的机会 联系苹果:https://developer.apple.com/contact…...