原因就是嵌套事务导致的,因为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的事物回滚了
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://jiaheming.cn/2025/02/java%e6%8a%a5%e9%94%99%e5%90%88%e9%9b%86/

共有 0 条评论