8

我读过这篇关于 JPA concurrency的文章,但要么我太厚,要么不够明确。

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

我可怜的慢大脑看来,我可以——当然在一个事务中——运行一个锁定模式为 的命名查询PESSIMISTIC_WRITE,看看它是否返回任何结果,然后是 apersist()或 a update()

我不清楚的是使用PESSIMISTIC_WRITE锁与PESSIMISTIC_READ锁执行此操作之间的区别。我已经阅读了这些句子——我知道这PESSIMISTIC_READ是为了防止不可重复读取,并且PESSIMISTIC_WRITE是......好吧,也许我不太理解那个句子:-)——但在它下面只是一个 SQL SELECT FOR UPDATE,是的? 在这两种情况下?

4

3 回答 3

4

我正在寻找进行数据库控制的原子更新如果找到其他插入操作(UPSERT)。

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

于 2010-09-30T20:17:55.440 回答
3

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

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

文章链接

于 2013-02-20T22:52:15.560 回答
0

我正在寻找进行数据库控制的原子更新如果找到其他插入操作(UPSERT)。

INSERT .. ON DUPLICATE KEY UPDATE这样做。

于 2017-04-30T18:15:24.690 回答