批处理异常UnexpectedRollbackException - 事务回滚

Kat*_*hir 4 java spring

我在进行批处理时遇到以下异常

encountered an error.org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
    at java.util.concurrent.FutureTask.get(FutureTask.java:111)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决可能出现的问题吗?

谢谢.

小智 6

可能你在另一个bean中的某个bean中有一个已检查的异常,但是spring的事务建议会注意到它并将标记事务以进行回滚.

您可以使用Transactional注释的noRollBackFor属性.


Deb*_*kia 5

在Spring管理的环境中获得此异常的可能性是将事务传播设置为REQUIRED:

<tx:method name="do*" propagation="REQUIRED" />
Run Code Online (Sandbox Code Playgroud)

考虑这样的场景:

来电者-------> [交易方法1(m1)] ----------> [交易方法2(m2)]

在Spring管理的环境中,事务logicalphysical事务之间存在差异.甲logical交易范围为在其上应用此设置每个方法创建.logical方法的事务范围m1不同于m2.每个logical事务可以单独确定其自己的仅回滚状态.使用此设置,外部事务范围(m1的范围)在逻辑上独立于内部事务范围(m2的范围).

但是所有这些范围都映射到同一个physical事务.因此,如果内部事务被标记为回滚,则它会影响外部事务的提交机会(即使外部事务没有抛出异常).

现在,如果从内部事务抛出异常并且标记为回滚.但是外部事务没有抛出异常,所以它还没有决定回滚本身,因此回滚(由内部事务范围静默触发)是意外的.并且UnexpectedRollbackException在那一点上抛出相应的对应物.

因此,如果内部事务(外部调用者不知道)以静默方式将事务标记为仅回滚,则外部调用者将接收UnexpectedRollbackException它仍然调用commit 的if.这表示外部调用者执行了回滚而不是提交.这是一种预期的行为,让事务的调用者知道存在异常并且事务被回滚.