spring 事务目前有二种,声明式(declarative transaction)和编程式(programming transaction)。
我们常用的有@Transactional去实现,而使用注解实现,那就会涉及到代理模式,而常用的有两种,一种是针对没有接口的cglib,另外一种就是针对有接口的jdk动态代理。
使用@Transactional无效的可能有:
1同一个类中,一个没有使用@Transactional注解的方法调用一个使用的@Transactional方法。
2在一个private 方法上添加上@Transactional。
Transactional是否生效, 仅取决于是否加载于接口方法, 并且是否通过接口方法调用(而不是本类调用)。
比较常见使用注解后没有生效的原因是mysql数据库的引擎不是InnoDB。