Spring事务管理
2018-10-12 10:51:18 0 举报
Spring事务传递
作者其他创作
大纲/内容
新建事务2
沿用事务2
REQUIRED2
无任何异常发生
回到上级
代理对象捕获到REQUIRED3抛出的非运行时异常,会走和REQUIRED3代理对象相同的流程,继续向上层返回,这是全局回滚标志rollbackOnly=false
REQUIRED1
情况1:代理对象捕获到REQUIRED2抛出的运行时异常,则走回滚流程,判断此时REQUIRED1是最外层事务,则马上回滚。情况2:若REQUIRED2的业务代码手动处理异常(把异常吃掉),则REQUIRED1会走commit流程,而该流程内部还是会判断全局rollbackOnly标志是否为true,为true则回滚;情况3:若REQUIRED2手动捕获异常并再次向上抛出非运行时异常,则REQUIRED1会走rollback流程,在该流程里会判断是非运行时异常,则会直接走commit流程,而commit流成参看情况2
REQUIRED3
沿用事务1
REQUIRED4
代理对象捕获到REQUIRED3抛出的运行时异常,则走回滚流程,同样会设置rollbackOnly=true,并将异常再往上抛。
抛出非运行时异常,代理对象会走rollback流程,但是该流程中判断是非运行时异常,因此会走commit流程。而在commit流程中判断rollbackOnly=false,不需要回滚,因此向上层返回
抛出运行时异常,代理对象会走回滚流程,设置rollbackOnly=true
情况1:代理对象捕获到REQUIRED2抛出的非运行时异常,则走回滚流程,判断是非运行时异常则走commit流程,commit流程判断rollbackOnly=false,不进行回滚,则马上commit,因此这种情况是不允许的!!!情况2:若REQUIRED2的业务代码手动处理异常(把异常吃掉),则REQUIRED1会走commit流程,而该流程内部还是会判断全局rollbackOnly=false,则马上commit,因此这种情况是不允许的!!!情况3:若REQUIRED2手动捕获异常并再次向上抛出运行时异常,则REQUIRED1会走rollback流程,在该流程里会判断是运行时异常且当前是最外层事务,则会直接走真正的rollback流程,这种情况是正常的!
REQUIRED_NEW3
新建事务1
抛出运行时异常
REQUIRED3、REQUIRED2、REQUIRED1修改的内容同时commit
抛出非运行时异常
REQUIRED1、REQUIRED2修改的内容同时commit
REQUIRED_NEW3、REQUIRED4修改的内容同时commit,然后回到上级
收藏
0 条评论
回复 删除
下一页