事务嵌套控制

一株草的剑意
  • 40

场景:
现在我有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成功提交

回复
阅读 719
2 个回答

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

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

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

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

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

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

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

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

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

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

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

你知道吗?

宣传栏