场景1
使用private、protect、static、final
场景2
rollbackfor未指定Exception
场景3
未使用spring注解,如@Service
场景4
数据库使用MyISAm,该数据库不支持事务,使用InnoDB
场景5
使用try...catch...了异常,未抛出异常
场景6
非事务方法调用了事务方法
解决办法
1、分开到不同的类去写方法
2、将@Transcation注解移到非事务方法上
3、在userService中再次注入userService,使用userService去调用方法
4、使用((UserService)AopContext.currentProxy()).insertUser(user);
原因
由于@Transcational的实现原理是AOP,AOP的实现原理是动态代理,自己调用自己的过程,不存在代理对象的调用,这样不会产生AOP去为我们设置@Transcational配置的参数,所以出现了自己调用自己时注解失效的现象。
场景7
数据源没有配置事务管理器,导致事务失效
场景8
指定的事务传播方式不支持传播,Propagation.NOT_SUPPORTED
场景9
多线程调用,两个线程拿到的数据库链接是不同的,无法根据数据库的commit或rollback来对事务生效