在jpa中悲观的读和悲观的写有什么区别?

s8vozzvw  于 2021-07-05  发布在  Java
关注(0)|答案(5)|浏览(376)

我已经阅读了JavaPersistence2.0中的锁和并发,并运行了示例应用程序。但我还是没有意识到悲观的阅读和悲观的写作之间的区别。我试图修改代码,其中使用悲观读取和悲观写入的代码将产生与使用“for update”调用sql相同的结果。

mzaanser

mzaanser1#

区别在于锁紧机构。 PESSIMISTIC_READ 锁意味着当你有这样一个锁时,脏读和不可重复读是不可能的。如果数据需要更改,则需要获取 PESSIMISTIC_WRITEPESSIMISTIC_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版

9wbgstp7

9wbgstp72#

该规范允许jpa实现为每个应用程序使用不同类型的数据库锁。大多数数据库只有一种声明性锁,因此在大多数实现中,这两种锁是相同的(没有区别)。

3mpgtkmj

3mpgtkmj3#

一个是读锁,另一个是写锁,或者分别在读或更新期间。
自由贸易协定:
悲观的你读。实体管理器在事务读取实体时立即锁定该实体。锁一直保持到事务完成。当您希望使用可重复读取语义查询数据时,将使用此锁定模式。换句话说,您希望确保在连续读取之间不会更新数据。此锁定模式不会阻止其他事务读取数据。
悲观的你写。一旦事务更新实体,实体管理器就会锁定它。此锁定模式强制尝试更新实体数据的事务之间的序列化。当并发更新事务中更新失败的可能性很高时,通常使用此锁定模式。

btqmn9zl

btqmn9zl4#

这个 PESSIMISTIC_READ 获取关联表行记录上的共享(读取)锁,而 PESSIMISTIC_WRITE 获取独占(写)锁。
共享锁阻止任何其他并发的独占锁请求,但它允许其他共享锁请求继续。
独占锁阻止共享和独占锁请求。
值得一提的是,对于hibernate,如果数据库不支持共享锁(例如oracle),那么一个共享锁请求(例如。, PESSIMISTIC_READ )只需获取独占锁请求(例如。, PESSIMISTIC_WRITE ).

7uzetpgm

7uzetpgm5#

这可能是最不专业的回答,所以如果我理解错了,我深表歉意。但我对前面答案中语言的复杂性感到沮丧,所以我决定发布一个简单的答案:
悲观读取:您在事务开始时获得一个记录锁,用于只读。基本上你是说“我不想任何人在我读这张唱片的时候更新它,但是我不介意其他人也读它”。这意味着人们尝试悲观的读会成功,但是那些尝试悲观的写会失败
悲观写入:您在事务开始时获得一个记录锁,用于写入。你的意思是“我要更新这个记录,所以在我完成之前没有人可以读写它”。这意味着那些尝试悲观的读取或悲观的写入都将失败
悲观部分指的是在事务开始时,即在对记录进行任何更改之前,而不是在事务结束时,当您准备将更改提交给记录时,获得锁。

相关问题