- @Transactional 应用在非 public 修饰的方法上。
- @Transactional 注解属性 propagation 设置错误。
- @Transactional 注解属性 rollbackFor 设置错误。
- 异常被catch捕获导致@Transactional失效,解决方式throw new 异常,把异常在抛出去。
- 数据库引擎不支持事务,这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB(从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭)。
自身调用问题,如下:
这里的updateOrder方法新开了一个事务是不起作用的,因为他们是自身调用,也就是类调用自己的方 法,没有经过spring的代理,默认只有在外部调用事务才会生效,所以可以把updateOrder方法放入另一个 类当中就能解决该问题。
注意点:
@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚,所以如果加上了rollbackFor = Exception.class,具备处理非RuntimeException错误的能力,即使遇到的错误不是runtimeException错误,事务也会正常回滚了。