一、事务的实现原理
就是在要开启事务的方法上加上一个@Transactional注解,当加上之后,spring会使用AOP的思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你的方法是否报错,来决定回滚还是提交事务。
如:
@Transactional(propagation = Propagation.REQUIRED)
public void method(){
//其他操作
}
二、事务的传播机制
比方说有一个方法A和一个方法B,方法A上面加了一个事务的注解,方法B上面也加了一个事务的注解:
@Transactional(propagation = Propagation.REQUIRED)
public void methodA(){
methodB();
}
@Transactional
public void methodB(){
//相关操作
}
当一个事务方法调用另一个事务方法的过程中,事务应该怎样来传播呢?
Spring的事务传播机制,就是来解决这种两个或者多个方法都加了@Transactional注解的情况下,这些方法互相串起来调用时,事务怎么传播的问题。
几种事务传播的级别:
1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该属性为默认属性。
也就是当methodA调用methodB时,如果methodB的事务传播级别是REQUIRED,则methodB中的操作会被一起加入到methodA中开启的事务里面去。
也就是把methodB中的代码加入到第一个事务里面去。
2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
也就是当methodA调用methodB时,如果methodB的事务传播级别是SUPPORTS,因为methodA已经开启了一个事务了,则methodB中的代码会加入到methodA开启的事务里面去;
如果直接调用methodB,因为当前并没有开启事务,则methodB中的代码会以非事务的方式去执行。
3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4、PROPAGATION_REQUIRES_NEW:不论当前存不存在事务,都创建新事务。
5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
平时用的比较多的有:
PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED。