【发布时间】:2011-11-04 08:51:34
【问题描述】:
根据Java Persistent/Locking wikibooks*,处理锁的最好方法是向用户报告乐观锁错误/异常。
问题在于它不可扩展。假设我有很多用户可能会通过相同的操作导致锁定。用户不关心锁错误信息。
简而言之:
- 最好的方法是禁用所有锁?
- 最好的方法是向用户报告错误锁定消息?但是用户必须重试他的操作,直到它起作用!
- 最好的方法是重试事务直到没有锁?
*
处理乐观锁异常
不幸的是,程序员常常为了自己的利益而过于聪明。使用乐观锁定时出现的第一个问题是发生 OptimisticLockException 时该怎么办。友邻超级程序员的典型反应,是自动处理异常。他们只会创建一个新事务,刷新对象以重置其版本,并将数据合并回对象并重新提交。 Presto 问题解决了吗?
这实际上首先破坏了锁定的全部意义。如果这是您想要的,您也可以使用无锁定。不幸的是,OptimisticLockException 很少会被自动处理,你真的需要就这个问题来打扰用户。您应该向用户报告冲突,或者说“抱歉,但发生了编辑冲突,他们将不得不重做他们的工作”,或者在最好的情况下,刷新对象并向用户呈现当前数据并他们提交的数据,并在适当的情况下帮助他们合并两者。
一些自动合并工具会比较数据的两个冲突版本,如果没有一个单独的字段发生冲突,那么数据将在没有用户帮助的情况下自动合并。这是大多数软件版本控制系统所做的。不幸的是,用户通常比程序更能决定什么时候发生冲突,仅仅因为 .java 文件的两个版本没有更改同一行代码并不意味着没有冲突,第一个用户可能已经删除了一个其他用户添加了一个方法来引用的方法,以及其他几个可能导致通常夜间构建经常中断的问题。
【问题讨论】:
-
How to disable the lock system of JPA? 的可能副本,来自同一作者。
-
我会说它们不是重复的,因为一个问如何禁用,另一个问带锁的策略。