@Transactional public void methodA(){ methodB(); //doSomething } @Transaction(Propagation=XXX) public void methodB(){ //doSomething }
事务管理员与事务协调员
简单理解:
如果 A 方法中调用了 B 方法,而A方法有事务,B方法也有事务。
我们就称 A方法中的事务是事务管理员,B方法中的事务是事务协调员。
事务传播行为:
描述的是事务协调员对事务管理员所携带事务的处理态度。
Spring中7中事务传播行为
传播属性 | 事务管理员 | 事务协调员 | 过程说明 | 描述 |
REQUIRED 假定:事务协调员的态度配成了REQUIRED |
开启T1 | 加入T1 | 如果事务管理员发起的时候有事务T1,而事务协调员配置成了REQUIRED,则事务协调员加入T1 | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
无 | 新建T2 | 如果事务管理员发起的时候没有开事务,而事务协调员配置成了REQUIRED,事务协调员需要事务,此时,事务协调员会新建一个事务T2 | ||
REQUIRES_NEW | 开启T1 | 新建T2 | 如果事务管理员开了个事务T1,事务协调员配置为REQUIRES_NEW,事务协调员会新建一个事务T2 | 新建事务,如果当前存在事务,把当前事务挂起。 |
无 | 新建T2 | 如果事务管理员没有事务,事务协调员配置为REQUIRES_NEW,事务协调员会新建一个事务T2 | ||
SUPPORTS | 开启T1 | 加入T1 | 如果事务管理员开了个事务T1,事务协调员配置为SUPPORTS,事务协调员会加入事务T1 |
支持当前事务,如果当前没有事务,就以非事务方式执行。 |
无 | 无 | 如果事务管理员没有事务,事务协调员配置为SUPPORTS,事务协调员没有事务 | ||
NOT_SUPPORTED (不支持事务) |
开启T1 | 无 | 如果事务管理员开了个事务T1,事务协调员配置为NOT_SUPPORTED,事务协调员不支持事务,于是事务协调员没有事务 | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
无 | 无 | 如果事务管理员没有事务,事务协调员配置为NOT_SUPPORTED,事务协调员不支持事务,于是事务协调员没有事务 | ||
MANDATORY (必须有事务) |
开启T1 | 加入T1 | 如果事务管理员开了个事务T1,事务协调员配置为MANDATORY,事务协调员会加入事务T1 | 使用当前的事务,如果当前没有事务,就抛出异常。 |
无 | ERROR |
如果事务管理员没有事务,事务协调员配置为MANDATORY,事务协调员要求必须有事务,于是事务协调员报错 | ||
NEVER (千万不要带事务) |
开启T1 | ERROR | 如果事务管理员开了个事务T1,事务协调员配置为NEVER,事务协调员要求事务管理员千万不要带事务,但事务管理员带了事务,于是事务协调员报错 | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
无 | 无 | 如果事务管理员没有事务,事务协调员配置为NEVER,事务协调员要求事务管理员千万不要带事务,事务管理员也没带事务,于是事务协调员也没有事务 | ||
NESTED | 设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚 | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
学习