什么是事务的传播机制

103 阅读2分钟

org.springframework.transaction 包有一个名为 TransactionDefinition 的接口,其定了七种事务传播机制。分别如下

七种传播机制

  • PROPAGATION_REQUIRED

支持当前事务,如果当前没有事务,就新建一个事务,如果当前存在事务,就加入其中,合并成为一个新的事务。这是最常见的选择。

  • PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。本方法会独立提交事务,不受调用方的事务影响,父级异常也可以正常提交。

  • PROPAGATION_INSTED

如果当前存在事务,其就会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束后才提交。如果当前没有事务,就会新建一个事务。如果其异常,父级会捕获其异常,但是不回滚正常提交,如果父级异常,其必定回滚。简单来讲,没有的话新建,有的话,父异常,子必回滚,子异常,父不回滚。 (嵌套事务只能对特定对任务管理器有效)

  • PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

  • PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  • PROPAGATION_MANDATORY

支持当前事务,如果当前没有事务,就抛出异常。

  • PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

一般常用 required 和 requires_new 这两个比较多,requires_new 一般用在子方法需要单独事务时使用。

RRISNMN

生效条件

In spring, when a method starts a transaction, spring creates a bean object of method's class

( proxy object of the object ). And spring check annotation on the method only when calling a bean object class. So when a method calls another method of itself, actually it calls the original object instead of a bean object. In such circumstances spring will not check and use annotation.