1

我正在使用 Spring“@Transactional”注释来处理事务。

   @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class)
public void updateBatch(Report a)
        throws SQLException, DataAccessException { insert1();insert2(); insert3(); }

但万一

  • insert1() - 成功插入表 A 中的数据。
  • insert2() - 成功插入表 b 中的数据
  • insert3() - 抛出检查异常并且不在表 C 中插入数据

这些插入是ibatis inbuild函数来触发DB中的插入我得到了以下异常

“引起:org.springframework.transaction.UnexpectedRollbackException:事务回滚,因为它已被标记为仅回滚
    在 org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:717)
    在 org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)"

并且事务不会回滚,即 insert1(),insert2() 不会回滚

请让我知道我错过了什么

4

1 回答 1

2

你在 insert1 和 insert2 中做什么?

他们是否在使用另一个具有PROPAGATION.REQUIRES_NEW属性的交易?如果是,它们将不会被回滚。否则您是在 insert1 还是 insert2 中回滚?

我遇到过同样的问题。尽管它可能与您拥有的有所不同。我遇到的情况是你有两个服务 A 和 B。

A 在 try-catch 块中调用 B 的方法。B 抛出 RuntimeException 并且 A 的 catch 块将该异常包装到一个已捕获的异常中。

在我的场景中发生了什么: - B 是事务代理后面的一个单独的类 - B 抛出一个运行时异常,它将事务设置为回滚 - 因为我有 Propagation.REQUIERED,它与 A 方法的事务相同 - A包装异常并将其抛出,因为异常既不是 RuntimeException 也不是错误,提及方法不会进入 transactionManager.rollback 而是进入 transactionManager.commit - 这将抛出 UnexpectedRollback,因为事务先前被标记为回滚。

你的情况可能不同。

于 2012-08-25T21:36:09.043 回答