Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring事务管理以回滚选中的异常_Spring - Fatal编程技术网

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

Spring事务管理以回滚选中的异常,spring,Spring,我正在使用Spring“@Transactional”注释来处理事务 @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED,rollbackFor=SQLException.class) public void updateBatch(Report a) throws SQLException, DataAccessE

我正在使用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中触发插入 我得到了以下例外

"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)" “原因:org.springframework.transaction.UnexpectedRollbackException:事务已回滚,因为它已被标记为仅回滚 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:717) 位于org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:393) 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)” 并且事务不会回滚,即insert1(),insert2()不会回滚


请务必让我知道我缺少什么

您在insert1和insert2中做什么

他们正在使用另一个具有
传播的事务。需要新的
属性吗?如果是,则不会回滚。否则,您将在insert1或insert2中回滚吗

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

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

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


您的情况可能会有所不同。

您遇到此错误b/c Spring正在尝试提交一个您的方法之一标记为“回滚”的事务。您是否也使用事务性方法对insert方法进行了注释?实际上insert1()、insert2()、insert3()是ibatis函数,它们只是将数据插入表中,如
sqlMapper.insert(“insertAccount”,account)实际上insert1()、insert2()、insert3()是ibatis函数,它们只是在表中插入数据,我读取了您的场景,因此在最后您是否能够回滚由checekd异常的bcz触发的事务在给定场景中,B回滚,但A不回滚,这会引发意外的回滚异常。如前所述,您是否将事务性方法置于插入方法之上?如果是,用什么方法传播?