Spring面试题之事务的传播行为
Spring事务的传播行为是java面试中比较常问到的内容,有同学总是会与隔离级别弄混淆。起始很好理解的,传播行为是多个事务方法之间的调用时,如何对事务进行管理。举个例子,方法A存在事务,方法B也存在事务,那么A方法调用B方法时,是用A的事务还是B方法的事务?这里就需要配置传播行为来告诉Spring如何去管理事务。
Spring事务分为七种:
REQUIRED
:支持当前事务,如果当前方法存在事务,就用当前方法的事务,如果当前方法不存在事务,就新建一个事务。比如A调用B,传播行为是REQUIRED,那么A方法存在事务,调用B方法时,B方法也会加入到A方法的事务中。A、B同时成功或同时失败。SUPPORTS
:支持当前事务,如果当前方法不存在事务,就以非事务运行。还是A、B两个方法,A方法不存在事务,A调用B,那么B方法也以非事务运行;但是如果A存在事务,那么B也加入A的事务。REQUIRES_NEW
:不支持当前事务,不管当前方法存不存在事务,都会新建一个事务执行。就是不管方法A有没有事务,A调用B时,B都会新建一个事务,B方法自己内部同时成功或同时失败.MANDATORY
:这个单词是强制的意思,“人如其名”,就是我一定要在事务中运行。如果当前方法不存在事务就抛出异常。NOT_SUPPORTED
:以非事务运行,不支持事务,如果当前方法存在事务,就挂起事务。A方法如果存在事务,A方法调用B方法,B方法会将A方法的事务挂起直到B方法运行完毕。直白的说,就是我B方法失败了也不用你A方法负责。NEVER
:以非事务方式运行,不支持事务,如果当前方法存在事务,就抛出异常。NESTED
:嵌套事务。如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。嵌套事务可以独立于外部事务进行提交或回滚。