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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?相关的知识,希望对你有一定的参考价值。

我已阅读文章Locking and Concurrency in Java Persistence 2.0,并运行示例应用程序。但我仍然无法意识到PESSIMISTIC_READ和PESSIMISTIC_WRITE之间的区别。我试图修改代码,并且使用PESSIMISTIC_READ和PESSIMISTIC_WRITE的代码将具有与“for update”调用sql相同的结果。

答案

不同之处在于锁定机制。

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

PESSIMISTIC_WRITE锁保证除了脏和不可重复的读取是不可能的,你可以更新数据而无需获得额外的锁(以及等待独占锁可能的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

另一答案

一个是读锁定,另一个是写锁定,或者分别在读取或更新期间。

FTA:

  • PESSIMISTIC_READ。实体管理器在事务读取后立即锁定实体。锁定一直持续到事务完成。当您想使用可重复读取语义查询数据时,将使用此锁定模式。换句话说,您希望确保在连续读取之间不更新数据。此锁定模式不会阻止其他事务读取数据。 PESSIMISTIC_WRITE。一旦事务更新实体管理器,实体管理器就会锁定该实体。此锁定模式强制尝试更新实体数据的事务之间的序列化。当并发更新事务中存在更新失败的可能性很高时,通常使用此锁定模式。
另一答案

PESSIMISTIC_READ在关联的表行记录中获取共享(读取)锁定,而PESSIMISTIC_WRITE获取独占(写入)锁定。

共享锁会阻止任何其他并发独占锁请求,但它允许其他共享锁请求继续。

独占锁会阻止共享和独占锁定请求。

值得一提的是,对于Hibernate,如果数据库不支持共享锁(例如Oracle),那么共享锁请求(PESSIMISTIC_READ)将只获取一个独占锁请求(PESSIMISTIC_WRITE)。

有关更多详细信息,请查看this article about locksthis article about JPA pessimistic lock types

另一答案

规范允许JPA实现为每个实现使用不同类型的数据库锁。大多数数据库只有一种类型的声明性锁,因此在大多数实现中,两者是相同的(没有区别)。

以上是关于JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

Lockmodetype.Pessimistic_Read 正在锁定锁定行以外的行

PES6 Setting中的默认设置

PES,TS,PS,RTP等流的打包格式解析之PES流

TS流分析-PES包头实例分析

ES流PES流PS流和TS流介绍

服装英语描述:100%PES ENGINEERED fABRIC (MAKO 3.7)是啥面料?