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
Java JPA乐观锁定_Java_Jpa_Jpa 2.0_Optimistic Locking - Fatal编程技术网

Java JPA乐观锁定

Java JPA乐观锁定,java,jpa,jpa-2.0,optimistic-locking,Java,Jpa,Jpa 2.0,Optimistic Locking,我在理解乐观锁定模式时遇到一些困难。 让我们在下面的场景中考虑:“线程A创建事务并从表用户读取所有用户的列表。线程B更新表用户中的用户。线程B提交。线程A提交”。 假设我正在使用乐观锁定。在这种情况下,第二次提交会导致抛出OptimisticLockException吗? 因为根据:“在提交(和刷新)期间,ObjectDB检查必须更新或删除的每个数据库对象,并将数据库中该对象的版本号与正在更新的内存中对象的版本号进行比较。如果版本号不匹配,事务失败并引发OptimisticLockExcepti

我在理解乐观锁定模式时遇到一些困难。
让我们在下面的场景中考虑:“线程A创建事务并从表用户读取所有用户的列表。线程B更新表用户中的用户。线程B提交。线程A提交”。 假设我正在使用乐观锁定。在这种情况下,第二次提交会导致抛出OptimisticLockException吗?
因为根据:“在提交(和刷新)期间,ObjectDB检查必须更新或删除的每个数据库对象,并将数据库中该对象的版本号与正在更新的内存中对象的版本号进行比较。如果版本号不匹配,事务失败并引发OptimisticLockException”.
不应引发任何异常,因为版本号仅针对那些必须更新或删除的实体进行检查

但是
是这样说的:“JPA乐观锁定允许任何人读取和更新实体,但是在提交时会进行版本检查,如果自实体读取后数据库中更新了版本,则会引发异常。”
根据这个描述,应该抛出异常,因为版本检查是在提交时进行的(我假设它们是指每次提交,包括读取后的提交)


我想实现的是,所描述的场景不应该抛出任何Concurency异常,如果线程A返回一个用户列表(不是最新的)也没有问题。因此,使用乐观锁定正确吗?如果不正确,我应该使用哪种锁定类型?

您给出的两个链接说明了相同的问题。如果某个实体正在TransactionA中更新,并且自TransactionA读取该实体后TransactionB在DB中对其进行了修改,则将引发OptimisticLockException

在本例中,您正在检索threadA中所有用户的列表,但只更新一个。只有在threadb中更改并提交(尝试)了相同的实体时,才会获得OptimisticLockException

在这种情况下,您可能希望抛出一个异常,否则只有一个更新会成功-最后一个提交将简单地覆盖早期提交-但最后一个将是哪一个有点不确定-有时threadA有时threadB和DB内容将真的不符合预期。因此,锁定可以防止这种不希望出现的行为


如果你的应用程序事务经常与数据发生冲突,考虑使用“悲观锁”也在

< P>中,你所给出的两个链接表示相同的事情。如果某个实体正在TransactionA中更新,并且自TransactionA读取该实体后TransactionB在DB中对其进行了修改,则将引发OptimisticLockException

在本例中,您正在检索threadA中所有用户的列表,但只更新一个。只有在threadb中更改并提交(尝试)了相同的实体时,才会获得OptimisticLockException

在这种情况下,您可能希望抛出一个异常,否则只有一个更新会成功-最后一个提交将简单地覆盖早期提交-但最后一个将是哪一个有点不确定-有时threadA有时threadB和DB内容将真的不符合预期。因此,锁定可以防止这种不希望出现的行为


如果你的应用程序事务经常与数据发生冲突,考虑使用“悲观锁”也在

< P>中,你所给出的两个链接表示相同的事情。如果某个实体正在TransactionA中更新,并且自TransactionA读取该实体后TransactionB在DB中对其进行了修改,则将引发OptimisticLockException

在本例中,您正在检索threadA中所有用户的列表,但只更新一个。只有在threadb中更改并提交(尝试)了相同的实体时,才会获得OptimisticLockException

在这种情况下,您可能希望抛出一个异常,否则只有一个更新会成功-最后一个提交将简单地覆盖早期提交-但最后一个将是哪一个有点不确定-有时threadA有时threadB和DB内容将真的不符合预期。因此,锁定可以防止这种不希望出现的行为


如果你的应用程序事务经常与数据发生冲突,考虑使用“悲观锁”也在

< P>中,你所给出的两个链接表示相同的事情。如果某个实体正在TransactionA中更新,并且自TransactionA读取该实体后TransactionB在DB中对其进行了修改,则将引发OptimisticLockException

在本例中,您正在检索threadA中所有用户的列表,但只更新一个。只有在threadb中更改并提交(尝试)了相同的实体时,才会获得OptimisticLockException

在这种情况下,您可能希望抛出一个异常,否则只有一个更新会成功-最后一个提交将简单地覆盖早期提交-但最后一个将是哪一个有点不确定-有时threadA有时threadB和DB内容将真的不符合预期。因此,锁定可以防止这种不希望出现的行为


如果你的应用程序事务经常与数据冲突,考虑使用悲观锁定也在

< P>乐观锁很容易理解:

每个实体都有一个timestamp/version numer属性

每次更新实体时,时间戳/版本号也会更新。 更新实体时,首先读取持久层(数据库)中的实际时间戳(如果自加载实体后该时间戳发生了更改),然后抛出OptimisticLockException,否则将随新的时间戳/版本号一起更新

如果您没有并发更新的风险,那么您不应该使用任何锁定机制,因为即使是乐观的机制也会对性能产生影响(您需要