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

2021-07-14  本文已影响0人  ppfengchen

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

上一篇下一篇

猜你喜欢

热点阅读