gpt4 book ai didi

hibernate - 内部事务中的 OptimisticLockException 破坏外部事务

转载 作者:行者123 更新时间:2023-12-02 04:12:18 28 4
gpt4 key购买 nike

我有以下代码 (OLE = OptimisticLockException) ...

public void outer() {

try {
middle()
} catch (OLE) {
updateEntities();
outer();
}
}

@Transactional
public void middle() {
try {
inner()
} catch (OLE) {
updateEntities();
middle();
}

@Transactional
public void inner() {
//Do DB operation
}
inner()由其他非事务方法调用,这就是为什么 middle()inner()是交易性的。如您所见,我通过更新实体并重试操作来处理 OLE。

我遇到的问题是,当我以这种方式设计事物时,我假设唯一可以获得 OLE 的时间是事务关闭时。这显然不是调用 inner() 的情况。即使堆栈是 outer()->middle()->inner() 也会抛出 OLE .

现在, middle()正在正确处理 OLE 并且重试成功,但是当需要关闭事务时,它已被标记为 rollbackOnly Spring 。当 middle()方法调用最终返回关闭方面抛出异常,因为它无法提交标记为 rollbackOnly 的事务.

我不确定在这里做什么。我无法清除 rollbackOnly状态。我不想在每次调用 inner 时都强制创建事务,因为这会影响我的表现。我是否遗漏了什么或者任何人都可以看到我可以以不同的方式构建它的方法?

编辑:为了澄清我在问什么,让我解释一下我的主要问题。如果您在 @Transactional 方法中,是否可以捕获和处理 OLE?

仅供引用:事务管理器是 JpaTransactionManager,JPA 提供者是 Hibernate。

最佳答案

好吧,在尝试了一段时间后,我想答案是否定的。每当您捕获 OLE 时,您必须确保开始新事务。我继续并重组了我的代码,这样中间就不必捕获 OLE。

关于hibernate - 内部事务中的 OptimisticLockException 破坏外部事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475039/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com