我已经阅读了文章Locking and Concurrency in Java Persistence 2.0,并运行了示例应用程序。但是我仍然不能理解PESSIMISTIC_READ和PESSIMISTIC_WRITE之间的区别。我尝试修改代码,其中使用PESSIMISTIC_READ和PESSIMISTIC_WRITE的代码将具有与使用for update调用的结果相同的结果。
发布于 2013-12-12 07:51:41
不同之处在于锁定机制。
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
发布于 2009-11-01 21:22:32
一个是读锁,另一个是写锁,或者分别在读或更新期间。
FTA:
PESSIMISTIC_WRITE。一旦事务更新了实体,实体管理器就会锁定该实体。此锁定模式强制在尝试更新实体数据的事务之间进行序列化。当并发更新事务之间更新失败的可能性很高时,通常使用此锁定模式。
发布于 2016-10-25 13:42:37
PESSIMISTIC_READ获取相关表行记录上的共享(读)锁,而PESSIMISTIC_WRITE获取独占(写)锁。
共享锁阻止任何其他并发排它锁请求,但它允许其他共享锁请求继续进行。
排它锁同时阻止共享和排它锁请求。
值得一提的是,对于Hibernate,如果数据库不支持共享锁(例如Oracle),那么共享锁请求(例如PESSIMISTIC_READ)将简单地获取排它锁请求(例如PESSIMISTIC_WRITE)。
https://stackoverflow.com/questions/1657124
复制相似问题