gpt4 book ai didi

java - 如何在使用 JPA 和 Hibernate 获得 OptimisticLockException 时重试服务方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:16 25 4
gpt4 key购买 nike

我在 hibernate 中遇到了一些脏写问题。我添加了@version 字段,以便我可以查看我是否正在写入过时的表。这意味着我现在有很多样板代码可以执行

try {
tryWriteToTable();
} catch (PersistenceExcepton) { //subclasss of OptimisiticLockException
try {
tryWriteToTable();
} catch (PersistenceExcepton) {
//dont try again - something seriously wrong
}
}

我正在使用 Spring,想知道其中是否有任何东西可以让我定义这种模式。如果有异常(exception),可以让我重复的东西。除了 Spring 之外,还有什么我可以使用来避免所有这些丑陋的样板代码。

我想要这样的东西

@TryTwice
private void tryWriteToTable() ....



谢谢

最佳答案

实现您的目标的最佳方法是使用拦截器来捕获 OptimisticLockingException 并允许您重试该操作。

但是请注意,只有当您获取最新的实体快照并复制没有旧版本属性的分离状态时,这才会起作用。像这样的策略很容易丢失更新。

因此,只有当您尝试保存的实体属性子集只能由您自己的进程更新,而不能由任何其他并发事务更新时,您才应该使用重试策略。

为了简化任务,我创建了 db-util open-source project ,在 Maven Central 上也可用。它基于 Spring AOP,它提供了一个 @Retry 注释来标记您希望在获得乐观锁定异常时重试的服务。

关于java - 如何在使用 JPA 和 Hibernate 获得 OptimisticLockException 时重试服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076188/

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