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