JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别? [英] What's the difference between PESSIMISTIC_READ and PESSIMISTIC_WRITE in JPA?

查看:251
本文介绍了JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已阅读 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║║读取可能║并发更新║
║║║交易║
╚════════════════════════════════════════════════════════════════════════════════════════════════ ══════════════════════════════════════════════════════════════════════════════════════════════════>>> >

资源:



JPA 2.1


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 2.1

这篇关于JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆