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。

你可能感兴趣的:(spring,java)