关于propagation="REQUIRES_NEW"事务的一些问题

关于propagation="REQUIRES_NEW"事务的一些问题

老师,打比方说现在有三个事务嵌套,事务一包含了事务二和三,在运行过程中,事务一挂起后,事务二运行报错,事务三是继续运行下去独立执行他的代码吗?

    我理解的是事务三执行完之后再执行事务一的代码1在最后控制台输出事务二的报错信息,不知道理解的对不对还请老师指点。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2022-09-26 12:29:35

同学你好,理解有些偏差,具体执行过程可参考下方案例一。

REQUIRES_NEW会新开启事务,外层事务不会影响内部事务的提交/回滚,但REQUIRES_NEW的内部事务的异常,会影响外部事务的回滚。

以课程源码为测试代码:

案例一 当importJob1()方法中存在异常时,运行过程日志如下:

https://img1.sycdn.imooc.com//climg/6331252f09b2beb415380338.jpg

案例二 当importJob2()方法中存在异常时,运行过程日志如下:

https://img1.sycdn.imooc.com//climg/6331285809733a1d17360861.jpg

案例三 importJob1()、importJob2()方法中无异常,但startImportJob存在异常是,执行过程日志如下:


https://img1.sycdn.imooc.com//climg/63312a40090b5c8504340185.jpg

https://img1.sycdn.imooc.com//climg/63312a020974598417620708.jpg

官方文档参考:https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#tx-propagation 

祝学习愉快~

  • 提问者 活在当下__ #1

    好的,谢谢老师指导。意思就是内部事务不分前后顺序,只要有异常,就独立回滚和资源释放并执行下一个独立事务,直到运行完毕。

    2022-09-27 07:18:25
  • 好帮手慕小小 回复 提问者 活在当下__ #2

    同学你好,内部事务执行顺序为代码书写顺序,REQUIRES_NEW会开启新事务,外层事务不会影响内层事务的提交和回滚操作,但是若内层事务出现异常,则外层事务也会同样进行回滚操作。例如:

    外层事务一包含了事务二importJob1()和事务三importJob2()

    https://img1.sycdn.imooc.com//climg/63325eaf09f6bbc604710184.jpg

    案例一:若事务二importJob1()报错出现异常,则事务二会回滚,外层事务一也会进行回滚操作,不会继续向下执行事务三。

    案例二:若事务二importJob1()正常执行提交,事务三importJob2()报错出现异常,则事务三回滚后,事务一也会回滚,程序结束。(事务二正常提交)

    祝学习愉快~

    2022-09-27 10:32:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师