在 jpa 中处理乐观锁定的最合适方法是什么。我有以下解决方案,但不知道使用它更好。
- 处理catch阻塞中的乐观锁异常并重试。
- 使用原子变量标志并检查其处理是否然后等待其他线程完成其处理。这样可以避免数据修改或锁定争用。
- 维护所有传入数据库更改请求的队列并一一处理。
任何人请建议我是否有更好的解决方案来解决这个问题。
最佳答案
您没有说明为什么使用乐观锁定。
您通常使用它来避免长时间阻塞资源(例如数据库行),即从数据库读取数据并将其显示给用户。最终用户对数据库进行更改,并且数据被写回。
您不想在此期间阻止其他用户的数据。在这种情况下,出于同样的原因,您不想使用选项 2。
选项 1 并不容易,因为乐观锁定异常告诉您某些内容在背后更改了数据,并且您将用您的数据覆盖这些更改。重新尝试写入数据在这里没有帮助。
选项 3 在某些情况下可能是可行的,但会增加很多复杂性并可能出现错误。到目前为止,这将是我最后的手段。
根据我的经验,乐观锁定异常非常罕见。在大多数情况下,最简单的解决办法是放弃所有内容,然后从头开始重做,即使这意味着告诉用户:抱歉,出现了意外问题,请重做一次。
另一方面,如果您经常在两个竞争线程之间遇到这些问题,则应该尽力避免它。在这些情况下,可以选择选项 2,但这取决于具体情况。
如果冲突发生在用户交互和后台线程之间(而不是两个用户之间),您可以尝试更改后台线程的计时,或向后台线程发出信号以延迟其工作。
总结一下:这主要取决于您的设置以及异常发生的时间和方式。
关于java - jpa中如何处理乐观锁异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28712901/