概述spa
当咱们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个完整的业务操做,所以就会产生服务接口方法嵌套调用的状况, Spring经过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。接口
事务传播是Spring进行事务管理的重要概念,其重要性怎么强调都不为过。可是事务传播行为也是被误解最多的地方,在本文里,咱们将详细分析不一样事务传播行为的表现形式,掌握它们之间的区别。事务
事务传播行为种类ci
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:get
表1事务传播行为类型it
事务传播行为类型io |
说明table |
PROPAGATION_REQUIREDclass |
若是当前没有事务,就新建一个事务,若是已经存在一个事务中,加入到这个事务中。这是最多见的选择。方法 |
PROPAGATION_SUPPORTS |
支持当前事务,若是当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY |
使用当前的事务,若是当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW |
新建事务,若是当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED |
以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER |
以非事务方式执行,若是当前存在事务,则抛出异常。 |
PROPAGATION_NESTED |
若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与PROPAGATION_REQUIRED相似的操做。 |
PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被彻底 commited 或 rolled back 而不依赖于外部事务, 它拥有本身的隔离范围, 本身的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行.
PROPAGATION_NOT_SUPPORTED 外部方法的Transaction暂停直至innerMethod执行完毕