• 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

  • 相关阅读:
    <LinkedList> 61
    <LinkedList> (hard + 高)25
    <DP> (高频)322
    <BackTracking> (dfs hard) 291
    <Tree> (高频)236
    <Math> 29 365
    <String> 161 358
    <Array> 309 (高)334
    <Array> 54 (高频+hard )45
    <Design> 359 346
  • 原文地址:https://www.cnblogs.com/rxx1005/p/15948141.html
Copyright © 2020-2023  润新知