客户端-服务器应用程序的 JPA 悲观锁逻辑

JPA pessimistic lock logic for client-server application

我正在学习JPA悲观锁。我找到了下面的解释

PESSIMISTIC_READ - The Entity is locked on the database, prevents any other transaction from acquiring a PESSIMISTIC_WRITE lock.

PESSIMISTIC_WRITE - The Entity is locked on the database, prevents any other transaction from acquiring a PESSIMISTIC_READ or PESSIMISTIC_WRITE lock.

如果我没理解错的话,那么如果我们有三个用户(A、B、C),用户A获得READ锁,那么用户B也可以获得READ锁,但是用户C无法获得WRITE锁,直到用户 A 和 B 释放他们的锁。如果用户 A 获得了 WRITE 锁,那么在用户 A 释放锁之前,用户 B 和用户 C 什么也得不到。

但是,对于我的客户端-服务器应用程序,我需要以下逻辑。如果用户只想读取实体,则他们以只读模式打开实体(无限数量的用户可以同时进行)。如果某个用户想要编辑他以 WRITE 模式打开它的实体 - 没有人可以在 WRITE 模式下打开同一个实体(直到用户释放 WRITE 锁)但所有其他人仍然可以在 READ-ONLY 模式下打开实体。

我有两个问题:

  1. 我对JPA悲观锁的理解对吗?
  2. 是否可以让 JPA 执行我需要的逻辑(使用 JPA 锁定机制)?

Is my understanding of JPA pessimistic lock right?

是的,这正是 read/write 锁定的工作原理

...but all other can still open the entity in READ-ONLY mode

我不太确定你的意思。我们还是在说多个事务同时执行吧(我有种奇怪的感觉,不是你的意思)?如果是这样,那么按照您的逻辑,持有 'READ_ONLY' 锁什么也做不了。

锁定意味着“我正在冻结此资源,以便某些其他事务在我完成之前无法继续”。但是,在您描述的逻辑中,当您持有 'READ_ONLY' 锁时,允许持有 'READ_ONLY' 锁的事务和持有 'WRITE' 锁的事务继续进行。