Spring事务失效的几种原因。
1.数据库引擎不支持事务
在MySQL数据库中有几种引擎(InnoDB,MyISAM,Memory等等),仅仅InnoDB支持事务,如果数据库底层都不支持事务的话,那么再怎么折腾都是白搭. mysql的myisam引擎不支持事务操作,innodb才支持事务。从mysql5.5.5开始的默认存储引擎是innodb 之前默认都是myisam
2.没有被spring管理
因为事务使用的是代理类织入。如@Service注解被注解掉,则该bean不会被spring管理
3.方法不是public的,@transactional加在private方法上
@Transactional只能加在public方法上,如果需要在private方法中加入事务,可以使用Aspect配transactionManager使用.
4.自调用问题- 本类方法调本类另一个方法
调用该类自己的方法,而没有经过spring的代理类,默认只有在外部调用事务才会生效。解决方案之一是在类中注入自己,用注入的对象再调用另外一个方法。