Spring事务传播特性

场景:假设有这样一段代码,两个方法都有事务,a()方法调用b()方法。

注意:如果两个有事务的方法在同一个bean里面,不能直接用 this.b(); 去调用b方法,否则会失效,因为Spring事务是基于AOP的动态代理实现的,要想让事务正常执行,需要用代理对象去调用b方法,而不能用真实对象去执行,而这里的 this 就是真实对象。

@Service
public class Demo {
    @Transactional
    public void a() {
        System.out.println("AAAAAAAA..");
        //        注意这里不能用 this.b(); 去调用b方法,否则b方法的事务会失效
        Demo demo = (Demo) AopContext.currentProxy();
        demo.b();
    }

    @Transactional
    public void b() {
        System.out.println("BBBBBBBB..");
    }
}
  • required
    如果a方法有事务,那b就用a的事务,如果a没有,那b就创建一个事务

  • supports

    支持事务,如果当前有事务则加入到这个事务,没有则以非事务的方式运行

    假设b方法是supports,如果a方法有事务,则加入到a方法的事务,如果a没有事务,则b就相当于一个普通方法(没有事务的方法)

  • mandatory

    支持当前事务,如果不存在事务则抛出异常

    假设b是mandatory,如果a方法没有事务,b就会抛出异常

  • requires_new

    开启一个新事物,如果当前有事务则挂起

    不管a方法有没有事务,b方法都要新建一个事务,两个事务相互独立,如果b出现异常,回滚事务,但是不影响a事务

  • not_supported

    不支持事务,总是以非事务的方式运行

    a有事务,b是not_supported,b总以非事务的方式运行

  • never

    不支持事务,如果当前有事务就直接抛出异常

    a有事务,b的事务是never,如果a调用b,则b会抛出异常

  • nested

    如果当前事务存在,则在嵌套事务中执行,否则类似于required

posted @ 2022-03-01 10:07  周星星、同学  阅读(99)  评论(0编辑  收藏  举报