LXX的网络日志
人因梦想而伟大
Spring中的事务传播机制

一共有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的事务方式执行。