Spring的事务传播机制
PROPAGATION_REQUIRED(默认实现):当前没有事务则新建事务,有则加入当前事务
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务则以非事务方式执行
PROPAGATION_MANDATORY:使用当前事务,如果没有则抛出异常
PROPAGATION__REQUIRES_NEW:新建事务,如果当前有事务则把当前事务挂起
PROPAGATION_NOT_SUPPORIED:以非事务的方式执行,如果当前有事务则把当前事务挂起
PROPAGATION_NEVER:以非事务的方式执行,如果当前有事务则抛出异常
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行1
public class a{
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
}
}
public class b{
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
}
}
public class c {
@Autowired
private a a;
@Autowired
private b b;
@Transactional(propagation = Propagation.REQUIRED)
public void test() {
a.method1();
b.method2();
}
}
整个test方法事务运行流程:
程序运行到test方法,因为当前乜有事务,按照规则,会新建一个事务。
运行method1的时候,因为test已经存在了事务,按照规则,method1会加入test
方法的这个大事务里面;
当运行到method2的时候,会新建一个事务,把test以及method1的这个事务挂起,
method2运行结束,继续test以及method1的事务(前提是method1跟method2不在一个类里面)。
若在同一个类里面,也需要新创建一个事务,则需要修改为以下写法(即需要通过Spring代理):
public class c {
@Autowired
private c c;
@Transactional(propagation = Propagation.REQUIRED)
public void test() {
c.method1();
c.method2();
}
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
}
}