事务失效场景
一、 访问符非public
1. 改为public
2. 开启AspectJ代理
注: static和final会导致动态无法代理,导致事务不生效;动态代理的方式有两种:JDK动态代理,cglib代理,static使method属于类而不属于任何对象,即使写法上是重写,也没有重写的含义,即重写static方法是没有意义的
二、 @Transactional抛出的异常并非是spring事务支持的异常。如:Exception
1. rollback=Exception.class
2. throw new RuntimeException
注:只支持uncheck的Exception
三、 数据库不支持的事务
mysql中的MyISAM是不支持事务的,InnoDB是支持事务的
四、@Service被注释
不被spring管理的是不支持事务的
五、 异常被捕获
1. 捕获的异常再抛出
六、 方法自身调用问题(非事务方法调用事务;自己调用自己)
1. 拆分
2. 自己注入自己,调用实例
3. 获取代理类(AopContext.currentProxy().method)
七、 数据源没有配置事务管理器
八、传播类型不支持事务
九、 多线程调用
多线程分为(1、继承Thread;2、实现Runable;3、实现Callable和Future(实现Callable接口后,用FutureTask包装Callable类,然后用Thread封装Future,最后使用start启动))
在方法上使用REQUIRES_NEW作为隔离等级,在调用方法上使用@Transactional开启事务
隔离类型
1. required 没有事务就新建,有就加入
2. support 有加入,没有就无事务执行
3. mandatory 没有事务就抛出异常
4. required_new 有事务就建一个新的事务
5. not_support 有事务就挂起,以非事务执行
6. never 以非事务执行,有就抛出异常
7. nested 有事务就嵌套执行,没有就建一个新的事务
required_new新事物执行完就会提交,但是nested会等待最外层的事务执行完再提交
嵌套事务分为父子事务:
父事务提交的时候,子事务也提交
父事务回退的时候,子事务也回退
但是子事务的回退不会影响到父事务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构