Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';JPA中悲观的读和悲观的写有什么区别?_Java_Jpa_Locking_Pessimistic - Fatal编程技术网

Java 什么';JPA中悲观的读和悲观的写有什么区别?

Java 什么';JPA中悲观的读和悲观的写有什么区别?,java,jpa,locking,pessimistic,Java,Jpa,Locking,Pessimistic,我已经阅读了这篇文章,并运行了示例应用程序。但是我仍然没有意识到悲观的阅读和悲观的写作之间的区别。我试图修改代码,其中使用悲观读取和悲观写入的代码将产生与使用“for update”调用sql相同的结果。一个是读取锁,另一个是写入锁,或者分别在读取或更新期间调用 自由贸易协定: 悲观主义者。实体经理 一旦发生错误,立即锁定实体 事务读取它。锁坏了 保留到事务完成。 此锁定模式在您需要时使用 使用可重复读取查询数据 语义学。换句话说,你想要 以确保数据不被删除 在连续读取之间更新。 此锁定模式不

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

一个是读取锁,另一个是写入锁,或者分别在读取或更新期间调用

自由贸易协定:

  • 悲观主义者。实体经理 一旦发生错误,立即锁定实体 事务读取它。锁坏了 保留到事务完成。 此锁定模式在您需要时使用 使用可重复读取查询数据 语义学。换句话说,你想要 以确保数据不被删除 在连续读取之间更新。 此锁定模式不阻止其他锁定 从读取数据中删除事务

    悲观的你写。实体经理 一旦发生错误,立即锁定实体 事务更新它。这把锁 模式强制在 试图更新数据库的事务 实体数据。这种锁定模式经常被禁用 在可能性较大时使用 并发系统中更新失败的原因分析 更新事务


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

区别在于锁机制

悲观读取
锁定意味着当您有这样一个锁定时,脏读取和不可重复读取是不可能的。如果数据需要更改,则需要获得
悲观写入

悲观写入
锁保证,除了脏的和不可重复的读取之外,您还可以在不获得额外锁的情况下更新数据(以及在等待独占锁时可能出现的
死锁

资源:


悲观读取获取关联表行记录上的共享(读取)锁,而悲观写入获取独占(写入)锁

共享锁阻止任何其他并发独占锁请求,但允许其他共享锁请求继续

独占锁阻止共享和独占锁请求


值得一提的是,对于Hibernate,如果数据库不支持共享锁(例如Oracle),那么共享锁请求(例如)将简单地获取独占锁请求(例如)。

这可能是技术性最低的答案,因此,如果语义错误,请道歉。但我对前面答案中语言的复杂性感到失望,所以我决定发布一个简单的答案:

  • 悲观读取:在事务开始时获得记录锁,仅用于读取。基本上你说的是“我不希望任何人在我读这张唱片时更新它,但我不介意其他人也读它”。这意味着尝试悲观主义阅读的人会成功,但尝试悲观主义写作的人会失败

  • 悲观写入:您在事务开始时获得记录锁,用于写入。你的意思是“我要更新这个记录,所以在我完成之前没有人可以读写它”。这意味着那些尝试悲观读或悲观写的人都将失败


悲观部分指的是在事务开始时,即在对记录进行任何更改之前,而不是在事务结束时,当您准备提交对记录的更改时,您获得了锁。

谢谢,我看到了描述,但它仍然让我感到困惑。当我使用悲观读取和悲观写入时,在“showsql”和running result中总是得到相同的结果。很好的解释!。您能添加一些示例代码来演示吗?@paka:JPA规范说:“允许实现在请求LockModeType.悲观_读取的位置使用LockModeType.悲观_写入,但反之亦然。”有关详细信息,请参阅
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║     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       ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝