本文为博主原创,未经允许不得转载:
1. spring的事务注解@Transactional只能放在public修饰的方法上才起作用,如果放在其他非public(private,protected)方法上,虽然不报错,但是事务不起作用
2.如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB引擎
3.在业务代码中如果抛出RuntimeException异常,事务回滚;但是抛出Exception,事务不回滚;
4. 如果在加有事务的方法内,使用了try...catch..语句块对异常进行了捕获,而catch语句块没有throw new RuntimeExecption异常,事务也不会回滚
5. 方法调用问题
比如下面代码,m2 方法上添加了事务功能,但是此时如果外面直接调用 m1 方法,此时 m2 的事务将失效,因为必须通过代理对象直接调用@Transaction 的方法时,事务才会起效,而 m1 方法中是通过 this 来调用 m2 方法的,而 this 是当前对象,并不是代理对象.
@Component public class DemoService { public void m1(){ this.m2(); } @Transactional public void m2(){ //执行db操作 } }
6. 业务代码和 spring 事务未在一个线程中
比如下面代码,在新的线程中去执行 db 操作,此时事务是失效的,程序需要确保 db 操作的代码和 spring 事务必须在同一个线程中,否则事务不受 spring 控制。
@Transactional public void m1() { new Thread() { 一系列事务操作 }.start(); }
标签: spring