事务嵌套控制
场景:
现在我有2个Service, ServiceA有methodA. ServicceB中有methodB。
现在ServiceA中的methodA调用ServiceB中的methodB,然后methodB报了异常,并抛出
然后我在methodA中catch到了这个异常,并想把这个异常信息,写入到数据库中。
结果Transaction rolled back because it has been marked as rollback-only
相当于就是serviceA中在commit的时候发现了serviceB中有回滚标记,有没有方法,先让ServiceB中的回滚掉,然后ServiceA成功提交
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你需要定义serviceB的methodB方法的事务传播属性为Propagation.REQUIRES_NEW。
建议了解一下spring的事务传播机制。
如果不仔细了解,你以后还会发现很多千奇百怪的事务问题,这会给你的开发造成困扰。
比如:定义了事务却没有生效,本以为会回滚,但是却提交了一部分。
可以看一下我的博客http://www.bestmazha.com/?p=128 ,这里有我学习过程中出现的问题。
Spring中的事务传播行为如下:
Required:支持当前事务,如果没有事务,就建一个新的,这是最常见的;
Supports:支持当前事务,如果当前没有事务,就以非事务方式执行;
Mandatory:支持当前事务,如果当前没有事务,就抛出异常;
Requires_New:新建事务,如果当前存在事务,把当前事务挂起;
Not_Supported:以非事务方式执行操作,如果当前存在事务,就把事务挂起;
Never:以非事务方式执行,如果当前存在事务,则抛出异常。
Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。
了解下spring的事务传播范围,你需要的是新建事务