当前位置: 首页 > 知识库问答 >
问题:

JPA中乐观锁是否防止阻塞?

惠翰藻
2023-03-14

我对JPA中乐观锁定的好处有点困惑。

我在版本化实体表上用两个线程和一行进行了测试。
这是我的发现:

T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: sleep
T2: begin tran
T2: fetch single entity
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - throws OptimisticLockException (expected)

第二次测试。请注意select语句的添加

T1: begin tran
T1: fetch single entity
T1: Update field in entity
T1: run select query on table (this causes a DB transaction to begin)
T1: sleep
T2: begin tran
T2: fetch single entity (this blocks until DB transaction of thread T1 completes!)
T2: Update field in entity
T2: commit trans
T1: wake up
T1: commit trans - ok, no exception. The fetch/update/commit of T2 happened after T1 commit. 

我真的没想到在使用乐观锁定时会发生任何阻塞,但是我的理解是,这里必须有一个数据库事务,以便从 select 语句返回正确的数据。
由于JPA似乎只在绝对必要时输入数据库事务,谁能解释一下乐观锁定的好处是什么?

共有1个答案

胡星汉
2023-03-14

在您的第一个示例中,JPA一直坚持更新,直到它必须刷新它们,这是正确的。在第二个示例中,它必须刷新它们,以便select处理最新数据。

乐观锁定的一个优点是数据库不必锁定任何表。这允许您的数据库更好地扩展,因为更多的客户端可以针对它发出语句。缺点是它将大部分并发控制转移到应用程序层。

这意味着您将需要实现错误处理或重试逻辑。如果您期望没有争议的更新,这可能是好的。如果您希望许多客户端同时更新相同的JPA实体,则可能需要相当多的应用程序逻辑来处理错误并智能地重试更新,而不必诉诸“最后一次写入获胜”的情况。

你可能会觉得这篇博文很有趣https://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and

 类似资料:
  • 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也

  • 我在Oracle的博客上读到一篇关于JPA和锁定模式的文章。 我不完全理解和锁定模式类型之间的区别。 模式: 当用户选择这种模式时,他必须将EntityManager的状态flush()放到数据库中,以手动增加版本字段。因此,所有其他乐观事务都将失效(回滚)。在事务结束时还会对版本进行检查,以提交或回滚事务。 这似乎很清楚,但什么时候应该使用模式与模式?我看到的唯一标准是,当我希望事务优先于其他事

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

  • 乐观锁Version 要使用乐观锁,需要使用version标记 type User struct { Id int64 Name string Version int `xorm:"version"` } 在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值。 var user User engine

  • 众所周知,有两种锁定策略:乐观锁定和悲观锁定 悲观锁定是锁定记录供您独占使用,直到您使用完它。它比乐观锁定具有更好的完整性,但是需要您小心应用程序设计以避免死锁。 也知道,乐观并发控制与多版本并发控制(Oracle或MSSQL-Snapshot/MVCC-RC)不同:乐观与多版本并发控制-差异? 但是,如果在两个事务中都使用OCC(乐观并发控制),会在两个交易之间发生死锁吗? 我们可以说乐观锁通过

  • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自