【发布时间】:2010-09-30 18:52:49
【问题描述】:
我看过this article on JPA concurrency,但是要么我太厚,要么不够明确。
我希望进行数据库控制的原子更新-if-found-else-insert 操作(UPSERT)。
它看起来在我可怜的慢大脑看来,我可以——当然在一个事务中——运行一个锁定模式为 PESSIMISTIC_WRITE 的命名查询,看看它是否返回任何结果,并且然后是persist() 或update()。
我不清楚的是使用PESSIMISTIC_WRITE 锁与PESSIMISTIC_READ 锁执行此操作之间的区别。我已经阅读了这些句子——我知道PESSIMISTIC_READ 旨在防止不可重复的读取,而PESSIMISTIC_WRITE 是......好吧,也许我不太理解那个:-)——但在下面这只是一个 SQL SELECT FOR UPDATE,是吗?在这两种情况下?
【问题讨论】:
-
嗨莱尔德。你有机会在这方面工作吗?有什么有趣的发现吗?
-
我没有时间深入了解实际情况。我设置了 PESSIMISTIC_WRITE 锁,因为并发文章似乎试图暗示这实际上允许我执行无竞争条件的 UPSERT。切线:UPSERT 似乎是一种令人难以置信的常见操作,在 JPA 中必须有一种方法。
-
我觉得我在这里错过了一些东西。如果有必要,你为什么不能只做一个 find() + insert() 。我想交易会保证原子性吗?我认为锁定类型不太重要,您甚至可以使用乐观锁定+版本控制?我想使用唯一约束来保护重复条目。
标签: jpa concurrency upsert pessimistic-locking