内容来源:https://www.bilibili.com/video/BV1T34y1t7pf?spm_id_from=333.851.b_7265636f6d6d656e64.2
1、事务方法的修饰符不是public
解决方法:
1)改成public
2)开启AspecJ代理模式
2、@Transactional注解的方法抛出的异常不受事务支持
解决方法:
1)把这个异常加入rollbackfor
2)抛出运行时异常或rollbackfor中的异常
3、数据表本身不支持事务
解决方法:把MyISAM换成InnoDB
4、@Transactional注解没有被Spring管理(比如漏了@Service,这样就不会被加载成bean,也就不会有事务了)
5、try-catch掉异常后没有再次抛异常
6、事务方法调用自身(因为自己调用自己不是动态代理)
解决方法:
1)把被调用者(加了事务的方法)和调用者分开
2)自己注入自己 @Autowired
3)手动获取代理类来调用
4)把被调用者的@Transactional移到调用者方法上
7、传播行为不支持事务(Propagation.NOT_SUPPORTED)
8、多线程调用
两个方法如果在不同的线程中,事务是不同的(不是同一个数据库连接)【底层是connection.commit或connection.rollback】