一共有7种事务传播行为
这个东西比较基础,权当是为了后面的笔记做铺垫了。
示例代码:
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB;
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {serviceB.methodB();}
}
@Service
public class ServiceB {
@Transactional
public void methodB() {}
}
简单的说说,有以下几种:
(1)PROPAGATION_REQUIRED:这个是最常见的,就是说,如果ServiceA.methodA调用了ServiceB.methodB,如果ServiceA.methodA开启了事务,ServiceB.methodB也开启了事务,那么ServiceB.methodB的事务就不会开启了,算做ServiceA.methodA里面的事务。methodA、methodB里面的代码报错了,都会把事务进行回滚。
(2)PROPAGATION_SUPPORTS:methodA调用methodB,methodA里面有事务(REQUIRED),methodB里面是(SUPPORTS),那么methodB就按照有事务的方式执行。methodA没事务,methodB是(SUPPORTS)那么就都没有事务。
(3)PROPAGATION_MANDATORY:methodA调用methodB,methodA里面没有事务,methodB用的是MANDATORY,就报错,要求methodA必须有事务。
(4)PROPAGATION_REQUIRES_NEW:methodA调用methodB,methodA是REQUIRED,methodB是REQUIRES_NEW,然后methodB会自己开一个事务,methodA、methodB是两个事务。但是methodA执行报错,不会回滚methodB的事务,如果没有catch methodB的异常, methodB的事务报错会影响到methodA的事务。
(5)PROPAGATION_NOT_SUPPORTED:methodA调用methodB,methodA是REQUIRED,methodB是NOT_SUPPORTED,执行methodA的时候有事务,执行methodB的时候会把methodA的事务挂起,methodB就以非事务的方式执行。
(6)PROPAGATION_NEVER:methodA调用methodB,methodA是REQUIRED,methodB是NEVER,直接报错,因为要求执行methodB的时候是没有事务的。
(7)PROPAGATION_NESTED:methodA调用methodB,methodA是REQUIRED,methodB是NESTED,methodB就是methodA的一个子事务,如果异常了就回滚到开启子事务的这个save point。如果methodA没有事务,methodB就按照REQUIRED的事务方式执行。