【发布时间】:2011-11-04 08:11:42
【问题描述】:
我正在使用 OpenJPA,但遇到了锁定问题。我已经了解了什么是 OptimisticLockException 以及它何时被抛出。
但是我该如何处理呢?
在下面*,您可以找到关于乐观锁异常的一小段内容。
简而言之,我如何才能完全禁用锁管理器?
在我的 persistent.xml 中,我有以下 xml 代码,但它不起作用。为什么?
...
<properties>
<property name="openjpa.LockManager" value="none" />
</properties>
...
*根据关于 Java Persistent 的 wikibooks:
处理乐观锁异常
不幸的是,程序员常常为了自己的利益而过于聪明。使用乐观锁定时出现的第一个问题是发生 OptimisticLockException 时该怎么办。友邻超级程序员的典型反应,是自动处理异常。他们只会创建一个新事务,刷新对象以重置其版本,并将数据合并回对象并重新提交。 Presto 问题解决了吗?
这实际上首先破坏了锁定的全部意义。如果这是您想要的,您也可以使用无锁定。不幸的是,OptimisticLockException 应该很少被自动处理,你真的需要就这个问题来打扰用户。您应该向用户报告冲突,或者说“抱歉,但发生了编辑冲突,他们将不得不重做他们的工作”,或者在最好的情况下,刷新对象并向用户呈现当前数据并他们提交的数据,并在适当的情况下帮助他们合并两者。
一些自动合并工具会比较数据的两个冲突版本,如果没有一个单独的字段发生冲突,那么数据将在没有用户帮助的情况下自动合并。这是大多数软件版本控制系统所做的。不幸的是,用户通常比程序更能决定什么时候发生冲突,仅仅因为 .java 文件的两个版本没有更改同一行代码并不意味着没有冲突,第一个用户可能已经删除了一个其他用户添加了一个方法来引用的方法,以及其他几个可能导致通常夜间构建经常中断的问题。
【问题讨论】:
-
这篇文章准确地解释了处理这个异常的好方法,大多数时候,只是通知用户它。如果您想禁用乐观锁定,为什么首先通过在实体中使用版本字段来启用它。只要不放任何版本字段,就不会有任何乐观锁。
-
是的,但问题是我不想向用户报告“嘿,伙计,有一把锁!”。用户不关心这个错误。那么,处理 lock 的最佳方法是什么?我真的不明白我要做什么。
-
如果两个用户同时修改一个实体,最后一个修改获胜,不管修改是什么,是否有问题?如果是问题,则使用乐观锁定,并在出现问题时通知您的用户。没有办法解决这个问题。如果这不是问题,则不要使用乐观锁定。最后一次修改,如果它不破坏数据库中的约束,将永远获胜。但是让并发用户修改相同的数据将总是导致异常(例如,因为某些用户可能会在其他用户提交对同一实体的修改之前删除实体)。
-
@Sandro Munda。如果那只是报告,那你为什么需要交易呢?此外,我相信 OptimisticLockException 会在更新时发生。还有一个问题,为什么需要更新报告?