事务失效的几种情况

一、事务管理的基本概念

事务有四个重要特性,称为ACID特性:

  • Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不完成。
  • Consistency(一致性):事务完成后,数据要处于一致的状态
  • Isolation(隔离性):一个事务的执行不能被其他事务干扰
  • Durability(持久性):事务完成后,数据应该永久保存

在Spring中,事务管理通常通过**@Transactional**注解实现

二、常见的事务失效场景

2.1、自调用

自调用指的是,一个方法调用领同一个类的另一个方法,事务管理会失效。
类内部非直接访问带注解标记的方法B,而是通过普通方法A,然后由A调用B

@Service
public class Demo {public void A() {this.B();}@Transactionalpublic void B() {......}
}

解决方法:

解决方法就是讲这些方法拆分到不同的类中,或者通过Spring代理来调用这些方法。


```java
@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableTransactionManagement
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}
((ServiceA)AopContext.currentProxy()).deSave(user);

或者
请添加图片描述

2.2 非public修饰的方法

@Transactional注解只能在public修饰的方法下使用

/*** 私有方法上的注解,不生效(因私有方法Spring扫描不到该方法,所以无法生成代理)*/
@Transactional
private boolean test() {//test code
}

2.3 异常类型不匹配

@Transactional注解默认只管理运行时异常(如RuntimeException及其子类)和错误(如Error)。当抛出未被捕获的运行时异常时,Spring会触发事务回滚操作,将之前的操作撤销;对于受检异常(即必须被捕获或声明抛出的异常,例如IOException,SQLException等),除非你明确配置事务管理器来处理他们,否则事务不会回滚。

可以通过rollbackFor和noRollbackFor属性来指定需要要回滚或不需要回滚的异常类型。
@Transactional(rollbackFor = SQLException.class)

@Transactionalpublic void insertAll(PoMaster master) throws Exception {poMasterDao.insert(master);if(1 == 1){// 故意引发受检异常,事务默认不会回滚throw new SQLException("A checked exception occurred.");}poItemDao.insertList(master.getItems());}

2.4、传播属性设置问题

请添加图片描述

propagation属性错误

@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事务不生效,如:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

2.5 捕获异常未抛出

自己消化掉异常

@Transactional
public void A(){try{......}catch(Exception e){// 未抛异常}
}

2.6 Bean没有纳入Spring IOC容器管理

//注解调@Componment,该类没被Spring管理,事务也不生效

// 注释调@Component,该类没被Spring管理,事物也是不生效的
public class Demo {@Transactional(rollbackFor = Exception.class)public void A() {......}
}

2.7 事务方法内启动新线程进行异步操作

主线程没有拿到子线程的异常,所以代理类以为正常执行了

@Transactional()public int transfer2(String from,String to, int money){accountDao.decrMoney(from,money);
new Thread(()->{int c = 5/0;accountDao.addMoney(to,money);}).start();return 1;}

2.8 数据库不支持事务

MySQL中,MyISAM引擎不支持事务,InnoDB支持事务

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

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

相关文章

如何在电脑上演示手机上APP,远程排查移动端app问题

0序: 对接客户,给领导演示移动端产品,或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏,但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频,十分繁琐…

Windows图形界面(GUI)-DLG-C/C++ - 滑动条(Trackbar)

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​​​​链接点击跳转博客主页 目录 滑动条(Trackbar) 使用场景 初始控件 控件消息 示例代码 滑动条(Trackbar) 使用场景 音量控制 亮度调节 视频播放进度控制 任何需要用户在特定范围内选择值的场景 初始控…

恶补,先验分布,后验分布 ,似然估计

恶补,打一遍增加印象 先验分布后验分布,似然估计 声明:仅记录个人学习,并无其他用途。 先验分布 后验分布, 似然估计 隔壁小哥的故事: 隔壁小哥要去15公里外的一个公园里玩,小哥可以选择步行…

【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘

已解决:ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决:ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因: 解决办法: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…

离散型随机变量为何不是左连续?

目录 离散型随机变量 引言 离散型随机变量的定义和性质是什么? 定义 性质 如何证明离散型随机变量的分布函数在每个可能取值处不具有左连续性? 离散型随机变量的阶梯状分布函数是如何影响其左连续性的? 在统计学中,有哪些方…

web前端面向对象面试25题

1 . 简述面向对象?主要特征是什么? 参考回答: 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物,是一种是软件开发方法面向对象主要有四大特性: 1、抽象 忽略一个主题中…

微信小程序-自定义组件生命周期

一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值,但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…

Gitee 使用教程1-SSH 公钥设置

一、生成 SSH 公钥 1、打开终端(Windows PowerShell 或 Git Bash),通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519 -C "Gitee SSH Key" 随后摁三次回车键(Enter) 2、查看生成的 SSH…

Carousel of Combinations

由圆排列的公式,不难有 C ( n , k ) ( k n ) k ! k C(n,k)(_k^n)\times \frac{k!}{k} C(n,k)(kn​)kk!​ 于是答案为 ∑ i 1 n ∑ j 1 i ( ( j i ) ⋅ ( j − 1 ) ! ) m o d j \sum_{i1}^{n}\sum_{j1}^{i}((_j^i)\cdot (j-1)!)mod\space j ∑i1n​∑j1i​((ji​…

React学习笔记(井字棋游戏)

本教程将引导你逐步实现一个简单的井字棋游戏,并且不需要你对 React 有任何了解。在此过程中你会学习到一些编写 React 程序的基本知识,完全理解它们可以让你对 React 有比较深入的理解。 教程分成以下几个部分: 配置 是一些准备工作。 概…

【Linux服务器Java环境搭建】010在linux中安装Redis,以及对Redis的配置与远程连接

系列文章目录 【Linux服务器Java环境搭建】 前言 好久没有更新博客了,今天下了班回到家,看到电脑桌上尘封已久的《Spring Boot应用开发实战》,翻开目录想起来之前写的系列【Linux服务器Java环境搭建】还未完结,那就继续吧&#…

实现异步天气数据获取与Spring缓存集成

你好呀,我是小邹。 在Web应用中,实时天气数据的获取是一个常见的需求,特别是在需要频繁更新天气信息的场景下,如旅游网站、天气应用或任何需要展示地理位置相关天气的应用。然而,频繁的外部API调用不仅会增加服务器的…

生成式AI的未来:对话的艺术与代理的实践

生成式 AI 的发展方向,是 Chat 还是 Agent? 随着生成式AI技术的不断进步,关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统(Chat)中展现智慧,还是在自主代理(Agent&#x…

操作系统知识点详情-任务调度

本文目录 一、名词解释1. 调度器2. 优先级(1)优先级反转(2)优先级继承协议(3)优先天花板 3. 任务状态:新建、就绪、运行、阻塞、终止。4. 任务类型:计算密集型、I/O密集型5. 实时任务…

virsh命令使用笔记

远程查看 virsh -c qemutcp://root192.168.1.102:16510/system list --all 网络配置 virsh net-define net-name.xml 定义网络 virsh net-dumpxml net-name 当前网络xml virsh net-start net-name 启动网络 virsh net-autostart net-name 自启动网络 virsh net-destr…

HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录 HDU1011——Starship Troopers(树形DP) 题目描述 运行代码 代码思路 树形DP HDU1012——u Calculate e 题目描述 运行代码 代码思路 HDU1013——Digital Roots 题目描述 超时代码 改进后依旧超时代码 运行代码 代码思路 HDU1011——…

前端转base64格式的字体图标方法

1.将需要的字体图标包下载到本地 2.访问 transfonter.org 将字体图标转成base64格式 如 这样就可以和正常的字体图标一样使用了

【Git】Git Submodules 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)

Git Submodules 介绍 1、为什么你值得读这篇文章?2、为什么有 submodules?3、了解 Git Submodules3.1、如何让一个Git仓库变为另一个Git仓库的 submodule3.2、submodule 的父子关系存在哪里3.3、submodule 的父子关系信息怎么存 4、submodule 开发常用操…

【SpringBoot】分页查询

1. Controller ApiOperation("分页查询")GetMapping("/page")public Result<PageResult> pageResultResult(EmployeePageQueryDTO employeePageQueryDTO) {System.out.println(employeePageQueryDTO.toString());PageResult pageResult employeeSer…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…