- 抛出异常导致不能正常回滚
原因:Spring只会回滚非检查异常
解法:在@Translational中配置rollbackFor属性
- 业务方法内try-catch异常导致事务不能回滚
原因:目标自己处理掉异常,事务通知无法知悉
解法:抛出异常
- aop切面顺序导致事务不能正常回滚
原因:事务切面优先级最低,自定义切面优先级若与事务切面一致,则还是自定义切面在内层。若此时自定义切面没有抛出异常,则会使事务不能正常回滚
解法:同上
- 非public方法导致事务不能正常回滚
原因:spring为方法创建代理,添加事务的前提条件是该方法为public
解法:换成public方法
- 父子容器导致事务失效
原因:子容器扫面范围太大,把未添加事务配置的service扫描进去了
解法:不要用父子容器,把bean放在同一个容器中
- 调用本类方法导致事务失效
原因:本类方法调用不经过代理,因此无法增强
解法:拿到代理来调用
- 事务没有保证原子行为
原因:数据库中事务的原子性不包括select方法,synchronized保证了方法的原子性,但由代理操作的commit操作不处于synchronized块内
解法:synchronized方法应该扩大到代理方法,使用select...for update替换select