美文网首页
Spring框架事务传播行为有7种

Spring框架事务传播行为有7种

作者: ppfengchen | 来源:发表于2021-07-14 13:16 被阅读0次

    Spring事务的7种传播行为

    事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

    例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

    Spring定义了七种传播行为:

    1、PROPAGATION_REQUIRED (需要传播)

    @Transactional(propagation = Propagation.REQUIRED)

    public void methodA() {

    methodB();

    // do something

    }

    @Transactional(propagation = Propagation.REQUIRED)

    public void methodB() {

        // do something

    }

    单独调用methodB方法时,因为当前上下文不存在事务,所以会开启一个新的事务。

    调用methodA方法时,因为当前上下文不存在事务,所以会开启一个新的事务。当执行到methodB时,methodB发现当前上下文有事务,因此就加入到当前事务中来。

    2、PROPAGATION_SUPPORTS(支持传播)

    @Transactional(propagation = Propagation.REQUIRED)

    public void methodA() {

    methodB();

    // do something

    }

    // 事务属性为SUPPORTS

    @Transactional(propagation = Propagation.SUPPORTS)

    public void methodB() {

        // do something

    }

    单纯的调用methodB时,methodB方法是非事务的执行的。当调用methdA时,methodB则加入了methodA的事务中,事务地执行。

    3、PROPAGATION_MANDATORY (强制传播)

    @Transactional(propagation = Propagation.REQUIRED)

    public void methodA() {

    methodB();

    // do something

    }

    // 事务属性为MANDATORY

    @Transactional(propagation = Propagation.MANDATORY)

    public void methodB() {

        // do something

    }

    当单独调用methodB时,因为当前没有一个活动的事务,则会抛出异常throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”);当调用methodA时,methodB则加入到methodA的事务中,事务地执行。

    4、PROPAGATION_REQUIRES_NEW(需要新的传播)

    @Transactional(propagation = Propagation.REQUIRED)

    public void methodA() {

    doSomeThingA();

    methodB();

    doSomeThingB();

    // do something else

    }

    // 事务属性为REQUIRES_NEW

    @Transactional(propagation = Propagation.REQUIRES_NEW)

    public void methodB() {

        // do something

    }

    如果methodA方法在调用methodB方法后的doSomeThingB方法失败了,而methodB方法所做的结果依然被提交。而除了 methodB之外的其它代码导致的结果却被回滚了。

    5、PROPAGATION_NOT_SUPPORTED(不支持传播)

    PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作为事务管理器。

    6、PROPAGATION_NEVER(永不传播)

    总是非事务地执行,如果存在一个活动事务,则抛出异常。

    7、PROPAGATION_NESTED(嵌套传播)

    如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

    这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。

    需要JDBC 驱动的java.sql.Savepoint类。使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true(属性值默认为false)。

    @Transactional(propagation = Propagation.REQUIRED)

    methodA(){

      doSomeThingA();

      methodB();

      doSomeThingB();

    }

    @Transactional(propagation = Propagation.NEWSTED)

    methodB(){

      ……

    }

    当methodB方法调用之前,调用setSavepoint方法,保存当前的状态到savepoint。如果methodB方法调用失败,则恢复到之前保存的状态。但是需要注意的是,这时的事务并没有进行提交,如果后续的代码(doSomeThingB()方法)调用失败,则回滚包括methodB方法的所有操作。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

    ————————————————

    版权声明:本文为CSDN博主「thee&sakura」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/qq382193833/article/details/103435034

    相关文章

      网友评论

          本文标题:Spring框架事务传播行为有7种

          本文链接:https://www.haomeiwen.com/subject/nrwppltx.html