JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别? [英] What's the difference between PESSIMISTIC_READ and PESSIMISTIC_WRITE in JPA?
问题描述
我已阅读 Java Persistence 2.0中的锁定和并发文章,并运行样品申请。但我仍然无法意识到PESSIMISTIC_READ和PESSIMISTIC_WRITE之间的区别。我试图修改代码,并且使用PESSIMISTIC_READ和PESSIMISTIC_WRITE的代码将具有与for update调用sql相同的结果。
区别在于锁定机制。
PESSIMISTIC_READ
lock意味着当你有这样的锁时,脏读和不可重复读是不可能的。如果要更改数据,则需要获取 PESSIMISTIC_WRITE
lock
PESSIMISTIC_WRITE
lock保证除了脏的和不可重复的读取是不可能的,你可以更新数据而无需获得额外的锁(以及等待独占锁时可能的死锁
)。
╔══════════════════════════════════════════════════════════════= ════════════════════════╦═════════════════════════ ═╗$ b $b║LockModeType║PESSIMISTIC_READ║PESSIMISTIC_WRITE║$ b $b╠═════════════════════════════════════════════════════════════════════════════════════════════════════════════ ═══════════════════════════════════════════════════════════════════════════════════════════════类型║共享锁定║独家锁定║
╠═══════════════════════════════════════════════════════════════════════════════════════════════ ══════════════════════════════════>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ║$ b $b║额外的锁║是║否║
╠═══════════════════════════════════════════════════════════════════════════════════════ ═══════════════════════════════════════════════════════════════════════════════════════════════脏读║否║NO║
╠═════════════════════════════════════════════════════════════════════════════════════ ════════════════════════════════════>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ║否║
╠══════════════════════════════════════════════════════════════════════════════════════════════ ═══════╬═════════════════════ ═════╣$ b $b║如何更新数据║获得PESSIMISTIC_WRITE║允许║
╠══════════════════════════════════════════════════════════════════════════════════════ ═════════════════════════╬════════════════════════ ══╣$ b $b║║没有人持有║没有人持有║$ b $b║如何获得锁定║PESSIMISTIC_WRITE║PESSIMISTIC_READ或║$ b $b║║║PESSIMISTIC_WRITE║$ b $b╠════ ══════════════════╬══════════════════════════╬════ ════════════════════════b $ b║║║当有一个高║
║║wa wa确保没有dead死锁的可能性或║$ b $b║何时使用║脏或不可重复║更新失败║$ b $b║║读取可能║并发更新║
║║║交易║
╚════════════════════════════════════════════════════════════════════════════════════════════════ ══════════════════════════════════════════════════════════════════════════════════════════════════>>> >
资源:
I have read the article Locking and Concurrency in Java Persistence 2.0, and run the sample application. But i still cant realize the difference between PESSIMISTIC_READ and PESSIMISTIC_WRITE. I tried to modify the code, and where the code using PESSIMISTIC_READ and PESSIMISTIC_WRITE will have the same result that the sql will invoked with "for update".
解决方案 The difference lies in locking mechanism.
PESSIMISTIC_READ
lock means that dirty reads and non-repeatable reads are impossible when you have such a lock. If data should be changed it's required to obtain PESSIMISTIC_WRITE
lock
PESSIMISTIC_WRITE
lock guarantees that besides dirty and non-repeatable reads are impossible you can update data without obtaining additional locks(and possible deadlocks
while waiting for exclusive lock).
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║ 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 ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝
Resources:
这篇关于JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!