1、方法权限问题
定义的事务方法的访问权限必须是public,是private、default、或protected的话,spring则不会提供事务功能
2、抛出检查异常
如果@Transactional没有特别指定的情况下,Spring只会在运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。
解决方案:配置rollbackFor属性,例如@Transactional(rollbackFor = Exception.class)
3、业务方法本身不活了异常
Spring回滚判断是根据是否抛出异常决定的
4、错误的使用了传播机制
Spring事务的传播机制是指在多个事务方法调用时,确定事务应该如何传播的策略。Spring提供了7种事务传播的机制:REQUIRED、SUPPORT、MANDATORY、REQUIRES_NEW、NOT_SUPPORT、NEVER、NESTED
。
事务传播机制说明:
Propagation.REQUIRED:Spring默认的事务传播机制,在外层有事务的时候加入外层事务,如果外层没有事务就创建一个事务执行。
Propagation.SUPPORT:如果外层存在事务则加入事务,如果外层不存在事务则以非事务的方式执行;
Propagation.NOT_SUPPORT:不支持事务,如果外层存在事务则挂起,执行完当前方法再回复外层事务之行;
Propagation.REQUIRES_NEW:每次都会创建新事务,如果外层存在事务则挂起,当当前事务执行完后恢复外层事务,如果外层无事务,则执行新的事务;
Propagation.MANDATORY:如果外层没有事务则抛出异常;
Propagation.NEVER:不支持外层事务,如果外层有事务则抛出异常;
Propagation.NESTED:该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的。
5、没有被Spring管理
不再Spring容器管理中也就无法使用了。
6、方法使用了static或final关键字
spring事务底层使用了aop,通过动态代理生成了代理类,在代理类中实现的事务的功能,使用final或static的话就无法重写被代理的方法