许多人认为spring一个事务方法不该该调用另外一个事务方法,不然将产生两个事务,实际上是没有正确理解spring的事务传播性和边界spring
Spring 对事务控制的支持统一在 org.springframework.transaction.TransactionDefinition 类中描述,
该类有如下几个重要的接口方法:接口
int getPropagationBehavior():事务的传播行为事务
int getIsolationLevel():事务的隔离级别get
int getTimeout():事务的过时时间it
boolean isReadOnly():事务的读写特性。io
所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring 支持 7 种事务传播行为:方法
PROPAGATION_REQUIRED 若是当前没有事务,就新建一个事务,若是已经存在一个事务中,加入到这个事务中。这是最多见的选择。im
PROPAGATION_SUPPORTS 支持当前事务,若是当前没有事务,就以非事务方式执行。异常
PROPAGATION_MANDATORY 使用当前的事务,若是当前没有事务,就抛出异常。时间
PROPAGATION_REQUIRES_NEW 新建事务,若是当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,若是当前存在事务,则抛出异常。
PROPAGATION_NESTED 若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与 PROPAGATION_REQUIRED 相似的操做。
下面简要介绍下事务的边界