JPA乐观锁(READ)的说明

ngunha02

我正在阅读有关jpa锁定的文章。链接:https//blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and

在关于乐观锁(READ)的部分中,作者具有代码段,该代码段表示由于异常而使事务2回滚。基于代码段,事务2在事务1修改dep的名称之前获取了对dep的锁定。如果我正确地理解了学校的演讲,从获得锁(在本文中为em)到释放锁(在本文中为tx2.commit)到采取行动(将员工提高10%,在本文中)是原子的,这意味着该部门的名称不能设置为“ MarketEng”,因此该员工的工资提高了10%。在提交tx2之后,它将释放锁,并且dep的名称最终将设置为“ MarketEng”。因此,不会回滚任何事务,这是线程安全的。

我理解正确吗?如果没有,请向我解释作者“ e1得到他应得的加薪”的意思。

wrschneider

乐观锁定有点用词不当-没有实际的锁定。您所描述的行为em.lock是悲观锁在tx2中该行为将阻止tx1中的更新。在JPA中,悲观锁转换为select .. for updateDB中的行级锁乐观锁则不然。

乐观锁定改为使用计数器在对象更新时进行通信,或验证是否发生了更新。写操作总是使计数器递增。使用LockMode.OPTIMISTIC进行的读取将在提交时检查计数器,如果值已更改,则失败并发生异常或回滚。

乐观锁定的要点是,您对实际在同一对象实例上发生的此类冲突很少感到“乐观”,因此,冒着提交失败的风险要比使用实际的行级锁定来减慢所有操作的风险更好,而不必担心僵局。

在此特定示例中,有两个事务同时运行:

  • tx1将部门名称从“ Eng”更改为“ MarketEng”
  • tx2“锁定”部门(实际上不是锁,而是承诺在tx2.commit上检查部门的版本计数器)
  • 仅当部门名称=“ Eng”时,tx2才会加薪。
    • tx1已更改它,但尚未提交
    • tx2的部门名称仍为=“ Eng”,因此员工可以加薪
  • tx1提交更改-这将增加部门的计数器
  • tx2检查版本计数器,发现它已更改,然后回滚

但是,此示例还是有缺陷的,因为从业务或用户角度来看的影响与直觉不符-如果tx1只是在提交tx2之后才开始,则部门名称在员工加薪后会立即更改。如果名称稍早更改一秒钟,为什么有关系?

我想使用的比喻是版本控制系统。大多数版本控制系统(例如svn和git)都使用某种形式的乐观锁定。允许两个人同时开始处理同一个文件,但是当您尝试提交别人首先提交的文件时,会出现错误。其他版本控制系统,例如Visual SourceSafe(至少是我上次使用它)使用悲观锁定,在这种情况下,您必须签出文件进行编辑,而签出是互斥锁-没有其他人可以签出同一文件以进行锁定编辑,直到您提交。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

卡桑德拉乐观锁

乐观锁和并发

休眠乐观锁机制

PostgreSQL 乐观锁

如何在程序中使用乐观锁?

OpenJPA:从乐观锁中排除字段更新

乐观锁和org.hibernate.StaleObjectStateException:

@Version为空时的乐观锁失败

乐观锁模式和session.get()与session.createQuery()

保存对象时出错-保存实体上的乐观锁异常

正在获取过时的对象错误。乐观锁:它如何工作?

JPA乐观锁定与同步Java方法

使用JPA的表互斥锁

在JPA / Hibernate的无状态应用程序乐观锁定

春季数据JPA:删除乐观锁定语义

如何使用StampedLock乐观锁?(我无法理解从Java doc的代码示例)

如何在没有乐观或悲观锁的情况下处理服务方法的并发问题?

Spring Hibernate @Data更新与原始UPDATE查询:尽管有@Transactional,但乐观锁异常?

JPA-悲观锁-锁存在时会发生什么?

无等待和无锁算法的示例/说明

你什么时候会在 postgres 可序列化隔离级别上使用 Hibernate 乐观锁?

当更新同时运行时,乐观锁定不起作用 Spring Data JPA

是否有使用Hibernate / Spring Data JPA进行乐观锁定的通用方法?

JPA实体在Ubuntu上进行了更新,但在Windows上引发了乐观锁定异常

scipy.io.wavfile.read 返回说明

在Tarantool中,有没有一种方法可以在执行更新之前检查元组的状态(乐观锁检查/ CAS模式)?

悲观锁不起作用Spring Boot Data JPA

没有JPA的情况下如何实现持久锁?

JPA锁和数据库隔离级别