Spring事务是什么?
多个事务方法相互调用,事务如何在这些方法直接进行传递?
方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A事务具体执行造成影响,同时方法A的事务对方法B事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定;
七个事务传播类型
REQUIRED(Spring默认的事务传播类型) | 如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务 |
---|---|
SUPPORTS | 当前存在事务,则加入这个事务,若当前不存在事务,则以非事务方法运行 |
MANDATORY | 当前事务存在,则加入事务。若当前事务不存在,则抛出异常 |
REQUIRES_NEW | 创建一个新事务,若当前事务存在,则挂起新建的事务 |
NOT_SUPPORTED | 以非事务方式运行,如果当前存在事务,则挂起当前事务 |
NEVER | 不使用事务,如果当前事务存在则抛出异常 |
NESTED | 若当前事务存在,则在嵌套事务中执行(父子事务),否则和REQUIRED的操作一样(开启一个事务) |
NESTED和REQUIRES_NEW的区别
REQUIRES_NEW是新建一个事务并且开启的新事务_与原有事务无关。而NESTED则是当前存在事务时(存在父事务)会开启一个嵌套事务(子事务)。在NESTED的父事务回滚时,子事务也会回滚,而在REQUIRES_NEW情况下,原有事务回滚不会影响新事务的开启。
NESTED和REQUIRED的区别
REQUIRED情况下,调用方法存在事务时,则被调用方法与调用方法使用同一个事务,那么被调用方法出现异常时,由于共用同一个事务,所以无论方法中是否有catch()语句块捕捉异常,事务都会回滚。而在NESTED事务情况下,被调用方法发生异常时,调用方可以使用catch()捕捉异常,这样子事务会回滚而父事务不受影响。