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

时间:2019-07-04 20:34:41

标签: java jpa java-ee locking

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

  

PESSIMISTIC_READ-实体已锁定在数据库上,防止任何   通过获取PESSIMISTIC_WRITE锁进行其他交易。

     

PESSIMISTIC_WRITE-实体已锁定在数据库上,防止任何   通过获取PESSIMISTIC_READ进行的其他交易,或   PESSIMISTIC_WRITE锁定。

如果我理解正确,那么如果我们有三个用户(A,B,C)并且用户A获得了READ锁定,那么用户B也可以获得READ锁定,但是用户C直到用户A都无法获得WRITE锁定。 B释放锁。而且,如果用户A获得了WRITE锁定,那么直到用户A释放锁定后,用户B和用户C才能一无所获。

但是,对于我的客户端服务器应用程序,我需要以下逻辑。如果用户只想读取一个实体,则以只读模式打开该实体(无数用户可以同时执行该操作)。如果某位用户想要编辑该实体,则可以在“写”模式下打开它-没有人可以在“写”模式下打开同一实体(直到用户释放“写”锁),而其他所有用户仍可以在“只读”模式下打开该实体。

我有两个问题:

  1. 我对JPA悲观锁的理解正确吗?
  2. 是否可以使JPA符合我的逻辑(使用JPA锁定机制)?

1 个答案:

答案 0 :(得分:0)

  

我对JPA悲观锁的理解正确吗?

是的,这正是读/写锁定的工作原理

  

...但是其他所有对象仍可以以只读模式打开实体

我不确定您的意思。我们仍然在谈论同时执行多个事务,对(我有一种奇怪的感觉,那不是你的意思)?如果真是这样,那么按照您的逻辑,持有“ READ_ONLY”锁不会起到任何作用。

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