SpringBoot事务 - @Transaction失效原因

news/2025/3/12 23:06:52/文章来源:https://www.cnblogs.com/mango0219/p/18671672

SpringBoot事务 - Transaction失效原因


1. 数据库引擎不支持事务

这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。

从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么操作都是无济于事。


2. 没有被 Spring 管理

// @Service
public class OrderServiceImpl implements OrderService {@Transactionalpublic void updateOrder(Order order) {// update order}
}

上方例子中,@Service注解被注释了。这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。


3. 方法不是 public 的

@Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。


4. 自身调用问题

@Service
public class OrderServiceImpl implements OrderService {public void update(Order order) {updateOrder(order);}@Transactionalpublic void updateOrder(Order order) {// update order}}

update方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法,updateOrder 方法上的事务管用吗?

再看下面例子:

@Service
public class OrderServiceImpl implements OrderService {@Transactionalpublic void update(Order order) {updateOrder(order);}@Transactional(propagation = Propagation.REQUIRES_NEW)public void updateOrder(Order order) {// update order}
}

这次在 update 方法上加了 @Transactional,updateOrder 加了 REQUIRES_NEW 新开启一个事务,那么新开的事务管用么?

这两个例子的答案是:不管用!

因为它们发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效


5. 数据源没有配置事务管理器

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}

如上面所示,当前数据源若没有配置事务管理器,那也是不可以的!


6. 不支持事务

@Service
public class OrderServiceImpl implements OrderService {@Transactionalpublic void update(Order order) {updateOrder(order);}@Transactional(propagation = Propagation.NOT_SUPPORTED)public void updateOrder(Order order) {// update order}
}

Propagation.NOT_SUPPORTED: 表示不以事务运行,当前若存在事务则挂起。

这是主动配置了事务不生效,所以事务就不存在。


7. 异常被吃

@Service
public class OrderServiceImpl implements OrderService {@Transactionalpublic void updateOrder(Order order) {try {// update order} catch {}}
}

try..catch..捕获了一场,然而catch中还没有将异常抛出,所以springboot捕获不到异常,就无法进行回滚!


8. 异常类型错误

@Service
public class OrderServiceImpl implements OrderService {@Transactionalpublic void updateOrder(Order order) {try {// update order} catch {throw new Exception("更新错误");}}
}

try..catch..虽然捕获了异常且跑出了Exception异常,但是springboot只有捕获到RuntimeException异常时才会触发回滚。

如果你想触发其他异常的回滚,需要在注解上配置一下,如:

@Transactional(rollbackFor = Exception.class)

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

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

相关文章

供应链系统中的 “计划单、订单、通知单,入库 / 出库单” 的区别

在供应链管理中,各种单据是业务流程的核心纽带,但它们之间的区别和联系常常让新手感到困惑。本文从采购和销售两大业务场景出发,详细拆解了“计划单、订单、通知单、入库/出库单”等常见单据的定义、作用及相互关系。在供应链系统中,经常会听到一些名字相近,但是意思可能略…

20232209实验一《Python程序设计》实验报告

20232209 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2322 姓名: 吴易阳 学号:20232209 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

20242909王天宇_网络攻防实践第2次作业

20242909王天宇《网络攻防实践》第2次作业 1.实验内容 学习内容总结 本次实验内容涵盖了网络信息查询、网络安全扫描和个人隐私保护等多个方面,旨在通过实践掌握网络信息获取、漏洞分析及隐私保护的基本技能。主要学习内容如下:DNS与IP信息查询:通过 nslookup 等工具,学习如…

如何给海淘电子产品挑一根「合格」电源线——IEC 320解读

转载声明:https://sspai.com/post/72699 网站:少数派 作者:Levinson喜欢海淘的朋友们,你是否碰到过「买来的数码产品或家用小电器自带的电源插头不是中国大陆标准,不得不自己再配一根国标线却不知道该搜什么关键词」的尴尬时刻呢?实际上这些电源线都是有统一标准的,这个…

IEC 320解读——如何给海淘电子产品挑一根「合格」电源线

喜欢海淘的朋友们,你是否碰到过「买来的数码产品或家用小电器自带的电源插头不是中国大陆标准,不得不自己再配一根国标线却不知道该搜什么关键词」的尴尬时刻呢?实际上这些电源线都是有统一标准的,这个标准被称为 IEC 60320,所有的电源线都可以通过这个标准找到唯一的那一…

Netty基础—3.基础网络协议

大纲 1.网络基础的相关问题总结 2.七层模型和四层模型 3.物理层(网线 + 光缆 + 01电信号) 4.数据链路层(以太网协议 + 网卡mac地址) 5.网络层(IP协议 + 子网划分 + 路由器) 6.传输层(TCP和UDP协议 + Socket + 端口) 7.应用层(HTTP协议 + SMTP协议) 8.浏览器请求一个域名会发生什…

4, 表单

复选框 复选框组 将一组复选框或单选按钮组合成一组并排放置的Bootstrap按钮bootstrap.min.cssjquery.min.jsbootstrap.min.jsdiv.btn-group[data-toggle=buttons]label.btn.btn-default.activeinput[type=checkbox]{Option 1}label.btn.btn-defaultinput[type=checkbox]{Opti…

0:c#教程-概述

查看和调试 .net 源码 ildsm 工具查看程序集,SDK 目录下 ilspy 反汇编工具 1.3 C#面向对象编程基础 如何表达信息 --> 选择合适的数据结构 如何处理信息 --> 算法和程序控制结构 如何实现 --> 软件系统架构,面向对象的分析与设计 怎样构造求解问题的算法? 算法,…

2,CSS

CSS盒子模型IE盒模型 border-box width和height是盒子最终的尺寸(添加box-sizing:border-box ) 标准盒模型 content-box width和height只是内容的尺寸(默认)width height background-color border padding margin (box-sizing)CSS布局实践 display 定义了元素生成的显…

Linux使用:Vim常用命令

多文件编辑 操作 c #c 是“修改(change)”(即删除后进入插入模式),后面可以接一个移动命令 cw #删除一个单词并进入插入模式 c2w 或者 2cw #删除两个单词并进入插入模式ctrl + h/w/u #删除前一个字符,前一个单词,前一行w/W #下一个单词开头 e/E # 下一个单词结尾 …

3, Bootstrap 按钮

按钮 按钮样式类背景颜色描述btn btn-default白色带渐变的默认灰色按钮。btn btn-primary深蓝色在一组按钮中的主动作按钮。btn btn-success绿色替代默认按钮。btn btn-info浅蓝色成功或正确的行动。btn btn-warning橙色表明此操作应注意。btn btn-danger红色表示危险或潜在的负…

Linux使用:文件与文件系统的压缩、打包与备份

8.2 Linux系统的压缩指令压缩文件扩展名:*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.xz 一般需要先用tar将许多文件打包成一个文件,再进行压缩。(因为gzip、bzip2、xz一次只能针对一个文件来压缩和解压缩)。gzip后缀:*.gz 可以解开:compress,zip,gzip压缩的文件(*.Z,*.zip,*.gz) gzip…