LockModeType.PESSIMISTIC_WRITE是否足以支持JPA中的UPSERT?

时间:2010-09-30 18:52:50

标签: jpa concurrency upsert pessimistic-locking

我读过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,是吗?在这两种情况下?

3 个答案:

答案 0 :(得分:4)

  

我希望做一个数据库控制的原子更新-if-found-else-insert操作(UPSERT)。

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

答案 1 :(得分:2)

我遇到过这种情况并发现了这个:

  

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

link到文章

答案 2 :(得分:0)

  

我希望做一个数据库控制的原子   update-if-found-else-insert操作(UPSERT)。

INSERT .. ON DUPLICATE KEY UPDATE就是这么做的。