JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?

2022-08-31 16:18:33

我已经阅读了Java Persistence 2.0中的锁定和并发性一文,并运行了示例应用程序。但是我仍然无法意识到 和 之间的区别。我试图修改代码,并且代码使用和将具有与SQL将调用相同的结果。PESSIMISTIC_READPESSIMISTIC_WRITEPESSIMISTIC_READPESSIMISTIC_WRITEfor update


答案 1

区别在于锁定机制。

PESSIMISTIC_READlock意味着当您有这样的锁定时,脏读和非可重复读取是不可能的。如果数据应该更改,则需要获取锁定PESSIMISTIC_WRITE

PESSIMISTIC_WRITElock保证除了不可能进行脏和非可重复的读取之外,您还可以在不获得其他锁定的情况下更新数据(并且在等待独占锁定时可能)。deadlocks

╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║     LockModeType     ║     PESSIMISTIC_READ     ║    PESSIMISTIC_WRITE     ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣ 
║         type         ║       SHARED LOCK        ║      EXCLUSIVE LOCK      ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣   
║  isReadOnly without  ║                          ║                          ║
║   additional locks   ║            YES           ║            NO            ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║      dirty reads     ║            NO            ║            NO            ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ non-repeatable reads ║            NO            ║            NO            ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ how to update data   ║ obtain PESSIMISTIC_WRITE ║         ALLOWED          ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║                      ║       no one holds       ║      no one holds        ║
║ how to obtain lock   ║     PESSIMISTIC_WRITE    ║   PESSIMISTIC_READ   or  ║
║                      ║                          ║   PESSIMISTIC_WRITE      ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║                      ║                          ║   when there is a high   ║
║                      ║  you want to ensure no   ║ likelihood of deadlock or║
║      when to use     ║ dirty or non-repeatable  ║   update failure among   ║ 
║                      ║   reads are possible     ║    concurrent updating   ║
║                      ║                          ║       transactions       ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝

资源:

JPA 2.1


答案 2

这可能是技术性最差的答案,所以如果我弄错了语义,请道歉。但是我对前面答案中语言的复杂性感到沮丧,所以我决定发布一个简单的答案:

  • PESSIMISTIC_READ:您在交易开始时获得记录上的锁定,仅用于读取目的。基本上,你是在说“我不希望任何人在我阅读时更新此记录,但我不介意其他人也阅读它”。这意味着那些尝试PESSIMISTIC_READ的人会成功,但那些尝试PESSIMISTIC_WRITE的人会失败。

  • PESSIMISTIC_WRITE:为了写入目的,您在交易开始时获得记录上的锁定。你说的是“我将更新这个记录,所以在我完成之前,没有人可以读取或写入它”。这意味着那些尝试PESSIMISTIC_READ或PESSIMISTIC_WRITE的人都会失败。

悲观部分是指您在事务开始时获得锁定,即在对记录进行任何更改之前,而不是在事务结束时,当您即将对记录提交更改时。


推荐