我正在使用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(); }
但以防万一
这些插入是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和插入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。交易回滚异常:事务被设置为仅回滚 出现这种异常的原因是什么?