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

Mr.Jia 2025-2-21 199 2/21

原因就是嵌套事务导致的,因为spring事务有传递性,spring默认的事务传播级别是PROPAGATIONREQUIRED,即当前上下文存在事务则用此事务,如果不存在事务则新建一个事务执行;
那么现在有A和B两个方法,这两个方法都开启了事务,A方法中调用B方法(因为都使用事务,默认的事务传播级别是PROPAGATION_REQUIRED、所以这过程中会使用同一个事务);
当执行B方法的时候,B方法抛出异常,这个时候事务就会被标记为仅回滚(因为在B方法中抛出异常,B方法这事务本该是要回滚,所以会将B方法的事务标记为rolback-only);
但是在A方法又catch到B方法抛的异常,但是A方法catch到异常后没有继续往上抛出,而是继续执行后面的代码,最后正常提交事务,那么就会抛出Transaction rolled back because it has been marked as rollback-only这异常!(因为AB是用同一个事务,在B方法执行的时候这个事务就标记为rollback-only,然后A方法继续使用该事务,然后又执行事务提交的操作,所以最后会抛异常)

 

简单来说就是在程序执行的时候,两个方法都添加了事物,其中A方法中调用的B方面里面抛出了异常,需要事物回滚但是在A方法中直接try catch了然后继续执行下面代码A中的代码提交事务,就会造成这个错误,总的来说就是A方法中提交事物了但是B的事物回滚了

- THE END -
Tag:

Mr.Jia

2月21日09:47

最后修改:2025年2月21日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论