Spring 事务失效场景总结

本文为博主原创,未经允许不得转载:

  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();
}

 

posted @ 2021-08-30 23:37  香吧香  阅读(218)  评论(0编辑  收藏  举报