当前位置: 首页 > 知识库问答 >
问题:

Spring事务管理以回滚选中的异常

百里丁雨
2023-03-14

我正在使用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中的数据。

这些插入是ibatis内置函数,用于触发DB中的插入。我遇到了以下异常

"Caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:717)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)"

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

请让我知道我错过了什么

共有1个答案

昌琪
2023-03-14

你在插入1和插入2中做什么?

他们是否使用另一个带有PROPAGATION.REQUIRES_NEW属性的事务?如果是,它们将不会被回滚。否则,您是在插入1还是插入2中回滚?

我也遇到过同样的问题。尽管它可能和你的有点不同。我遇到的情况是,你有两个服务a和B。

A正在try-catch块中调用B的方法。B抛出RuntimeException,A的catch块将该异常包装为捕获的异常。

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

你的情况可能不同。

 类似资料:
  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?

  • 我有一个类,它有一个方法,该方法调用另一个服务上的另一个方法。大概是这样的: 我预计一个实体将被插入,但是如果任何嵌套事务抛出异常插入将拒绝,即使这个异常也是在处理的。 我可以用注释。但它会胜过表演。

  • 我正在与用propagation.requires_new注释的方法的奇怪行为作斗争。 以下是TransactionManager的日志:

  • 我面临一个挑战,需要从SQL Server数据库中读取“未处理”的数据,处理数据,然后有选择地更新DB2数据库中的两到六个表,然后将该数据标记为在SQL Server上的原始数据库中已处理。在任何时候,如果出现任何故障,我希望所有更新都回滚。如果我有10个未处理的项目,9个良好,但有一个失败,我仍然希望9个良好的项目完成,第10个恢复到原始状态,直到我们可以研究问题并进行更正。 总体架构是,一个输

  • 我在tomcat服务器中使用具有多个数据源配置的JTA原子事务。有时我会遇到以下异常: JTA事务意外回滚(可能是由于超时);嵌套的异常是javax。交易回滚异常:事务被设置为仅回滚 出现这种异常的原因是什么?