我已经阅读了Locking and Concurrency in Java Persistence 2.0文章,并运行了示例应用程序。但是我仍然无法意识到PESSIMISTIC_READ和PESSIMISTIC_WRITE之间的区别。我试图修改代码,并且使用PESSIMISTIC_READ和PESSIMISTIC_WRITE的代码将具有与sql调用“for update”相同的结果。
最佳答案
区别在于锁定机制。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
关于java - JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1657124/