Transaction rolled back because it has been marked as rollback-only

翻译:
事务已被回滚,因为它已被标记为仅回滚

实例:
方法A:dao.insert
方法B:dao.update

以上都在事务配置中,传播级别(propagation):REQUIRED
方法A执行成功后执行B时报异常,此时如果try catch方法B则报异常:Transaction rolled back because it has been marked as rollback-only。
为什么?
事务本身就是一个AOP且order=0,什么意思?当你执行某一个Service方法时,事务本身进行切面监控,一旦有异常抛出则将它设置为只读,此时如果再去更新数据库则报该异常。order=0是执行顺序,值越小则越行执行before,也是最后执行after。所以你的项目中如果有多个aop时要特别注意顺序,搞不好你的事务就不会回滚。好吧,怎么解决这个异常?

解决办法:
1)去掉事务。(废话,当我没说)
2)将事务propagation调整为:REQUIRED_NEW,开启新事务。(若是二期项目不要这样,会出事)
3)try catch方法B后,将异常抛出去。
3)待定。还在想有没有更好的办法。

关于事务的propagation一些资料参考:

REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;

SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;

MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;

REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;

NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;

NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值