1. 访问权限问题
访问权限不是public
2. 方法用final修饰
某个方法被final/static修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能
3. 方法内部调用
同一类中的方法直接调用,会导致事务失效
解决方法:
- 新加一个Service方法
- 在该Service中注入自己
- 通过AopContent类
4. 未被spring管理
使用Spring事务,是有一个前置条件,那就是对象需要交给Spring进行管理,需要创建bean实例。
通常情况下,我们通过@Contrlller``@Service``@Component``@Repository等注解,实现将bean实例化喝依赖注入的功能。
5. 多线程调用
同一个事务,其实指同一个数据库连接,只有拥有同一个数据库连接才能同事提交和回滚。如果在不同的线程中,拿到的数据库连接肯定是不一样的。所以事务也是不同的
6. 表不支持事务
表的引擎不支持事务。InnoDB支持
Spring中事务未生效的场景之事务未回滚
7. 错误的传播特性
只有三种事务传播特性才会新建事务REQUIRED``REQUIRED_NEW``NESTED
8. 自己吞了异常
开发者自己捕获了异常,同时没有手动抛出。想要Spring能够正常回滚,则必须要抛出它能够处理的异常,如果没有抛出异常,Spring则会认为程序是正常的。
9. 手动抛了别的异常
人员自己捕获了异常,又手动抛出了异常:Exception,事务同样不会回滚。因为Spring事务,默认情况下只会回滚RunTimeException,和Error(错误),对于普通的Exception(非运行时异常),它是不会回滚的。
10. 自定义了回滚异常
rollbackFor默认值为UncheckedException,包括了RuntimeException和Error. 当我们直接使用@Transactional不指定rollbackFor时,Exception及其子类都不会触发回滚。
所以,建议一般情况下,将该参数设置成:Exception或Throwable。
11. 嵌套事务回滚多了
使用了嵌套的内部事务,原本是希望调用 roleService.doOtherThing 方法时,如果出现了异常,只回滚 doOtherThing 方法里的内容,不回滚 userMapper.insertUser 里的内容,即回滚保存点。但事实是,insertUser 也回滚了。
因为 doOtherThing 方法出现了异常,没有手动捕获,会继续往上抛,到外层 add 方法的代理方法中捕获了异常。所以,这种情况是直接回滚了整个事务,不只回滚单个保存点。