事务传播行为是指方法之间的调用事务策略的问题,在理解数据库的事务时,我们一般时希望事务能够同时成功或同时失败。但是在写代码的时候并非如此。如果在进行批处理时,其中的一条处理失败了,我们只希望失败的这条记录发生回滚,而不是因为一条处理失败使得所有之前的处理都回滚,这样就不可取了。
在 Spring 中传播行为的类型有 7 种,分别是,Propagation.REQUIRED、Propagation.REQUIRES_NEW、Propagation.SUPPORTS、Propagation.NOT_SUPPORTED、Propagation.NEVER、Propagation.MANDATORY 和 Propagation.NESTED 。
解释如下:
- Propagation.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务,这是 Spring 种默认的传播行为;
- Propagation.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起;
- Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,那么就不启用事务;
- Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起,直至方法结束;
- Propagation.NEVER:不支持事务,以非事务方式运行,如果当前存在事务,则抛出异常。
- Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。