spring事务失效的场景
spring事务的七种传播机制
事务方法发生了相互调用,事务如何传播:a调用b
- REQUIRED(spring默认的事务传播级别):如果当前(a)没有事务,则(b)新建一个事务,如果当前存在事务,则加入这个事务。
- REQUIRES_NEW:新建一个事务,如果当前存在事务,则挂起这个事务。各自有各自的事务
- SUPPORTS:如果当前存在事务,则加入这个事务。如果当前不存在事务,则以非事务方式运行
- NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则挂起事务,(a有事务就以事务方式运行,b以非事务方式运行)
- MANDATORY:当前存在事务,则加入这个事务,当前没有事务,则抛出异常
- NESTED:嵌套创建事务。如果当前存在事务,开启一个子事务。没有事务,就新建一个事务。(和required类似)
- NEVER:非事务方式运行,当前存在事务,抛出异常
ps:
REQUIRES_NEW:新建的事务和原来事务无关,互不影响
Nested:父事务回滚时,子事物也会回滚
spring事务失效的场景
1.数据库不支持事务(MyIsam):spring事务是基于数据库的,数据库引擎不支持事务。
2.没有被spring管理:比如业务层没有@Service注解,不由spring管理,自然事务不会生效。
3.spring没有开启事务:spring没有配置事务管理器DataSourceTransactionManager
4.spring不支持事务:事务传播机制的never或者not_supported这类,不支持事务。
5.方法不是public的:@Transation注解只能用于public方法的注解上。除非开启Aspectj代理模式
6.自身调用问题:spring事务通过aop来实现事务操作,如果只是类中使用this.或者直接调用方法,那就是相当于在代理类中调用了类中一个方法,事务自然失效。可以将自身注入,通过bean调用。
7.事务不会回滚:spring默认只会回滚非检查异常,RuntimeException,如果你想触发其他异常的回滚,需要在注解上使用rollbackfor配置一下
8.自己吞了异常:使用try cache将异常处理了,不抛异常,事务失效。
分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix