Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Multithreading JPA乐观锁(读取)说明_Multithreading_Jpa - Fatal编程技术网

Multithreading JPA乐观锁(读取)说明

Multithreading JPA乐观锁(读取)说明,multithreading,jpa,Multithreading,Jpa,我正在读一篇关于jpa锁定的文章。链接: 在关于乐观锁读取的部分中,作者有一段代码片段说事务2由于异常而回滚。根据代码片段,事务2在事务1修改dep的名称之前获取dep上的锁。如果我正确理解了学校的讲座,从文章中获得锁em.lock到文章中释放锁tx2.commit,文章中将员工加薪10%的操作是原子操作,这意味着dep的名称不能设置为MarketEng,因此,员工加薪10%。tx2提交后,它释放锁,dep的名称最终设置为MarketEng。因此,不会回滚任何事务,它是线程安全的 我理解正确吗?

我正在读一篇关于jpa锁定的文章。链接:

在关于乐观锁读取的部分中,作者有一段代码片段说事务2由于异常而回滚。根据代码片段,事务2在事务1修改dep的名称之前获取dep上的锁。如果我正确理解了学校的讲座,从文章中获得锁em.lock到文章中释放锁tx2.commit,文章中将员工加薪10%的操作是原子操作,这意味着dep的名称不能设置为MarketEng,因此,员工加薪10%。tx2提交后,它释放锁,dep的名称最终设置为MarketEng。因此,不会回滚任何事务,它是线程安全的


我理解正确吗?如果不是,请向我解释一下作者所说的e1得到了他不应得的加薪是什么意思。

乐观锁定有点用词不当——没有实际的锁定。您描述的行为是悲观锁,tx2中的em.lock会阻止tx1中的更新。在JPA中,悲观锁转换为带有select的行级锁。。用于数据库中的更新。乐观的锁是不存在的

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

乐观锁定的要点是,您乐观地认为,在实践中,相同对象实例上的此类冲突很少发生,因此最好冒提交失败的风险,而不是使用实际的行级锁来降低速度,并且必须担心死锁

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

tx1将部门名称从Eng更改为MarketEng tx2“锁定”部门,这不是真正的锁定,而是承诺在tx2.commit上检查部门上的版本计数器 tx2仅在部门名称为Eng时才给员工加薪。 tx1已更改,但尚未提交 tx2仍然有部门名称='Eng',因此员工可能会加薪 tx1提交更改-这会增加部门上的计数器 tx2检查版本计数器,发现它已更改,并使用 不过,这个例子有点缺陷,因为从业务或用户的角度来看,影响与直觉不符——如果tx1只是在tx2承诺后开始的,那么在员工获得加薪后,部门名称会立即更改。如果名字提前一秒更改,为什么会有关系


我喜欢用版本控制系统进行类比。大多数版本控制系统,如svn和git,都使用某种形式的乐观锁定。允许两个人同时开始处理同一文件,但当您尝试提交其他人首先提交的文件时,会出现错误。其他版本控制系统(如Visual SourceSafe)至少在我上次使用它时使用了悲观锁定,您必须签出一个文件进行编辑,签出是一个独占锁定-在您提交之前,其他人无法签出同一个文件进行编辑

哦,我一直认为事务2获得了dep的锁,并且在事务2完成之前不会释放它。现在这是有道理的。JPA乐观锁定听起来类似于我在学校学到的操作系统中的条件变量锁定技术。谢谢你的解释。