Spring事务的传播机制

时间:2024-11-15 16:53:43

spring事务的传播机制
1、spring事务
指封装在数据库事务之上的一种事务处理机制。其管理方法有两种,分别是编程式事务以及声明式事务。一般我们使用@Transactional进行声明式事务。

2、Spring事务的传播机制
事务的传播,是指一个方法调用另一个方法并将事务传递给它。事务的转播机制主要针对被调用者而言,控制它是否被传播或者被怎样传播。spring事务的传播机制有七种:

传播行为 描述
PROPAGATION_REQUIRED 默认的Spring事物传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务
PROPAGATION_REQUIRE_NEW 若当前没有事务,则新建一个事务。若当前存在事务,则新建 一个事务,新老事务相互独立。外部事务抛出异常回滚不会影响内部事务的正常提交
PROPAGATION_NESTED 如果当前存在事务,则嵌套在当前事务中执行。如果当前没有事务, 则新建一个事务,类似于REQUIRE_NEW
PROPAGATION_SUPPORTS 支持当前事务,若当前不存在事务,以非事务的方式执行
PROPAGATION_NOT_SUPPORTED 以非事务的方式执行,若当前存在事务,则把当前事务挂起
PROPAGATION_MANDATORY 强制事务执行,若当前不存在事务,则抛出异常
PROPAGATION_NEVER 以非事务的方式执行,如果当前存在事务,则抛出异常

传播级别一般不需要定义,默认就是PROPAGATION_REQUIRED,除非在嵌套事务的情况。上述描述表格的描述还是比较抽象,下面我们使用一个例子来说明这个传播机制。假定方法A调用方法B:

方法B定义的事务类型 A方法有事务时 A方法无事务
 @Transactional(propagation = )     B和A事务合并成一个事务 B新建一个事务
 @Transactional(propagation = Propagation.REQUIRES_NEW)   B新建一个事务,和A事务无关,互不影响 B新建一个事务
 @Transactional(propagation = )   B新建一个A的子事务,A异常影响B,B异常不影响A B新建一个事务
 @Transactional(propagation = )   B加入到A事务中 B无事务
 @Transactional(propagation = Propagation.NOT_SUPPORTED)   挂起A事务,B以无事务方式执行 B无事务
 @Transactional(propagation = )   B加入到A事务中 B抛异常
 @Transactional(propagation = )   B抛异常 B无事务