事务嵌套控制

发布于 2022-09-12 23:21:08 字数 414 浏览 20 评论 0

场景:
现在我有2个Service, ServiceA有methodA. ServicceB中有methodB。
现在ServiceA中的methodA调用ServiceB中的methodB,然后methodB报了异常,并抛出
然后我在methodA中catch到了这个异常,并想把这个异常信息,写入到数据库中。

结果Transaction rolled back because it has been marked as rollback-only
image.png

相当于就是serviceA中在commit的时候发现了serviceB中有回滚标记,有没有方法,先让ServiceB中的回滚掉,然后ServiceA成功提交

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤城病女 2022-09-19 23:21:08

你需要定义serviceB的methodB方法的事务传播属性为Propagation.REQUIRES_NEW。
建议了解一下spring的事务传播机制。
如果不仔细了解,你以后还会发现很多千奇百怪的事务问题,这会给你的开发造成困扰。
比如:定义了事务却没有生效,本以为会回滚,但是却提交了一部分。
可以看一下我的博客http://www.bestmazha.com/?p=128 ,这里有我学习过程中出现的问题。

已参与了 SegmentFault 思否「问答」打卡,欢迎正在阅读的你也加入。

萌梦深 2022-09-19 23:21:08

Spring中的事务传播行为如下:

Required:支持当前事务,如果没有事务,就建一个新的,这是最常见的;

Supports:支持当前事务,如果当前没有事务,就以非事务方式执行;

Mandatory:支持当前事务,如果当前没有事务,就抛出异常;

Requires_New:新建事务,如果当前存在事务,把当前事务挂起;

Not_Supported:以非事务方式执行操作,如果当前存在事务,就把事务挂起;

Never:以非事务方式执行,如果当前存在事务,则抛出异常。

Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。

了解下spring的事务传播范围,你需要的是新建事务

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文