1. 方法不是public的
@Transactional只能应用到public方法上,否则不会生效。
2. 数据库引擎不支持事务
某些数据库引擎不支持事务,比如MyISAM,这时@Transactional不会生效。
3. 没有被Spring管理
应用@Transactional的类必须是Spring管理的bean,否则事务不会生效。
4. 自身调用问题
如果A类调用了B类,而B类又调用了A类中的方法,那么A类中的事务可能会失效。(调用了自己类中的方法了)
5. 捕获了异常但没有抛出
如果在事务方法中捕获了异常但是没有抛出,也会导致事务失效。
6. 数据源没有配置事务管理器
Spring事务需要使用支持事务的DataSource并配置PlatformTransactionManager。
7. Propagation行为不匹配(默认为REQUIRED)
事务传播行为需要匹配调用栈,否则事务可能会意外commit或rollback。
8. 异常类型不匹配
Rollback只对RuntimeException和Error类型的异常起作用,对Checked Exception不起作用。
综上,使用事务时需要注意方法、异常、传播行为等多个方面,才能保证事务正确生效。