sping 事务失效的8中情况
1、抛出检查异常导致事务不能正确回滚
原因:Spring 默认只会回滚非检查异常
解决:配置 rollbackFor 属性
因:事务通知只
解法1:异常原样抛出
在 catch 块添加
throw new RuntimeException(e);
解法2:手动设置 TransactionStatus.setRollbackOnly()在 catch 块添加
解法1、2:同情况2 中的解法:1、2
解法3:调整切面顺序,在 自定义切面上添加 @Order(Ordered.LOWEST_PRECEDENCE - 1)
解法1:改为 public 方法
-
@Bean
public TransactionAttributeSource transactionAttributeSource() {
return new AnnotationTransactionAttributeSource(false);
}
5、父子容器导致的事务失效
解法1:各扫描各的,不要图简便
解法1:依赖注入自己(代理)来调用,需要在配置类上添加@EnableAspectJAutoProxy(exposeProxy = true)
解法2:通过 AopContext 拿到代理对象,来调用
事务在锁外层,多线程可能出现先释放锁,后提交事务的情况。debug测试,可启多个线程,断点DataSourceTransactionManager类doCommit方法 @Transactional(rollbackFor = Exception.class) public synchronized void test() { // todo }