事务的传播机制
Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务。
Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。
业务方法A可能调用业务方法B,这两个都使用了隔离级别,那么B事务的隔离机制以谁为准呢?
三种最常用的传播机制常量:
(A调用B,那么A被叫做B的当前事务或者交B的外部事务)
- REQUIRED:支持当前事务(外部事务),如果不存在外部事务,则创建新事务(事务B)
- REQUIRES_NEW:创建新事物,暂停当前事务(外部事务)
- NESTED:如果存在当前事务,那么嵌套在事务中执行(独立的提交和回滚),否者就和REQUIRED一样。
完整解释:
- propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
- propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
- propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
- propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
- propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
- propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作