【问题标题】:Is LockModeType.PESSIMISTIC_WRITE sufficient for an UPSERT in JPA?LockModeType.PESSIMISTIC_WRITE 对于 JPA 中的 UPSERT 是否足够?
【发布时间】: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


【解决方案1】:

我正在寻找执行数据库控制的原子更新-if-found-else-insert 操作(UPSERT)。

我可能没有完全回答整个问题,但如果您想在没有任何竞争条件的情况下实现上述内容,您需要 IMO 一个 table-level LOCK IN EXCLUSIVE MODE(不仅是行)。我不知道这是否可以用 JPA 完成。也许你可以澄清什么是你可以接受的。

【讨论】:

    【解决方案2】:

    我遇到过这种情况,发现是这样的:

    悲观锁定,这意味着在事务开始时锁定对象并在事务期间保持锁定由以下两种悲观锁定模式完成: - LockModeType.PESSIMISTIC_READ --> 实体可以被其他事务读取,但不能进行更改 - LockModeType.PESSIMISTIC_WRITE --> 实体不能被其他事务读写

    link到文章

    【讨论】:

      【解决方案3】:

      我正在寻找一个数据库控制的原子 update-if-found-else-insert 操作(UPSERT)。

      INSERT .. ON DUPLICATE KEY UPDATE 会这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多