[英]JPA repository doesn't perform update when called in Catch clause before throwing exception
我面临一个奇怪的问题,我创建了一个异步方法来进行一些处理,如果一切顺利,我将通过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
它将正常工作!
如果您的异常是RuntimeException,Spring将回滚该事务。
从文档:
尽管EJB容器的默认行为会在系统异常(通常是运行时异常)时自动回滚事务,但是EJB CMT不会在应用程序异常(即java.rmi.RemoteException以外的已检查异常)下自动回滚事务。
尽管Spring声明式事务管理的默认行为遵循EJB约定(仅针对未检查的异常会自动回滚),但自定义此行为通常很有用。
在此处阅读更多信息: https : //docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative
事务注释类型通常可以直接与Spring的RuleBasedTransactionAttribute类进行比较,而事实上AnnotationTransactionAttributeSource会将数据直接转换为后者,因此Spring的事务支持代码不必知道注释。 如果没有规则与异常相关,则将其视为DefaultTransactionAttribute(在RuntimeException和Error上回滚,但在检查的异常上不回滚)。
如果发生任何错误,更新事务是一个坏习惯,但是为了解决您的问题,您可以添加@Transactional(noRollbackFor= Exception.class)
并忽略此异常。 trx将不会回滚
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.