在 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.