我面临一个奇怪的问题,我创建了一个异步方法来进行一些处理,如果一切顺利,我将通过JPA存储库进行更新以将DB中的Flag设置为True。
万一发生异常,我调用存储库以标记False更新,然后重新抛出该异常。有趣的是,有例外时不会发生更新!
示例:
@Component
@Transactional
public class MyAsyncService{
@Async
public void asyncMethod() throws Exception{
try{
//Some Logic
myrepo.update(true);
} catch(Exception e) {
myrepo.update(false);
throw e;
}
}
}
一点也不例外。如果我删除了throw e
,就可以了!
答案 0 :(得分:1)
如果您的异常是RuntimeException,Spring将回滚事务。
从文档中
尽管EJB容器的默认行为会自动回滚 EJB上的系统异常(通常是运行时异常)上的事务 CMT不会在应用程序上自动回滚事务 异常(即除 java.rmi.RemoteException)。
Spring的默认行为 声明式事务管理遵循EJB约定(回滚 仅针对未检查的异常是自动的),通常对于 自定义此行为。
答案 1 :(得分:1)
事务注释类型通常可以直接与 Spring的RuleBasedTransactionAttribute类,实际上 AnnotationTransactionAttributeSource会将数据直接转换为 后一个类,这样Spring的事务支持代码就不会 必须了解注释。如果没有规则与 例外,它将被视为DefaultTransactionAttribute (在RuntimeException和Error上回滚,但未选中 例外)。
如果发生任何错误,更新交易是一个坏习惯,但是为了解决您的问题,您可以添加
@Transactional(noRollbackFor= Exception.class)
并忽略此异常。 trx不会回滚