首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么不同?

JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么不同?
EN

Stack Overflow用户
提问于 2009-11-01 21:02:01
回答 5查看 48.6K关注 0票数 57

我已经阅读了文章Locking and Concurrency in Java Persistence 2.0,并运行了示例应用程序。但是我仍然不能理解PESSIMISTIC_READPESSIMISTIC_WRITE之间的区别。我尝试修改代码,其中使用PESSIMISTIC_READPESSIMISTIC_WRITE的代码将具有与使用for update调用的结果相同的结果。

EN

回答 5

Stack Overflow用户

发布于 2013-12-12 07:51:41

不同之处在于锁定机制。

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

PESSIMISTIC_WRITE锁保证除了不可能进行脏的和不可重复的读取之外,您还可以在不获取额外锁的情况下更新数据(在等待排它锁时可能会出现deadlocks )。

代码语言:javascript
复制
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║     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

票数 54
EN

Stack Overflow用户

发布于 2009-11-01 21:22:32

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

FTA:

  • PESSIMISTIC_READ.一旦事务读取该实体,实体管理器就会锁定该实体。该锁将一直保持到事务完成。当您想要使用可重复读取语义查询数据时,可以使用此锁定模式。换句话说,您希望确保数据不会在两次连续读取之间更新。此锁定模式不会阻止其他事务读取数据。

PESSIMISTIC_WRITE。一旦事务更新了实体,实体管理器就会锁定该实体。此锁定模式强制在尝试更新实体数据的事务之间进行序列化。当并发更新事务之间更新失败的可能性很高时,通常使用此锁定模式。

票数 29
EN

Stack Overflow用户

发布于 2016-10-25 13:42:37

PESSIMISTIC_READ获取相关表行记录上的共享(读)锁,而PESSIMISTIC_WRITE获取独占(写)锁。

共享锁阻止任何其他并发排它锁请求,但它允许其他共享锁请求继续进行。

排它锁同时阻止共享和排它锁请求。

值得一提的是,对于Hibernate,如果数据库不支持共享锁(例如Oracle),那么共享锁请求(例如PESSIMISTIC_READ)将简单地获取排它锁请求(例如PESSIMISTIC_WRITE)。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1657124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档