San*_*nda 8 java jpa locking openjpa
根据Java Persistent/Locking wikibooks*,处理锁的最佳方法是向用户报告Optimistic Lock Error/Exception.
问题是它不可扩展.假设我有很多用户可能会使用相同的操作导致锁定.用户不关心锁定错误消息.
简而言之 :
*
处理乐观锁定异常
不幸的是程序员经常会因为自己的利益而过于聪明.使用乐观锁定时出现的第一个问题是在发生OptimisticLockException时要执行的操作.友好邻居超级程序员的典型反应是自动处理异常.他们将只创建一个新事务,刷新对象以重置其版本,并将数据合并回对象并重新提交.Presto问题解决了,或者是吗?
这实际上首先打破了整个锁定点.如果这是你想要的,你也可以不使用锁定.不幸的是,很少会自动处理OptimisticLockException,你真的需要打扰用户这个问题.您应该向用户报告冲突,并且说"您的抱歉但发生编辑冲突并且他们将不得不重做他们的工作",或者在最好的情况下,刷新对象并向用户显示当前数据和他们提交的数据并帮助他们合并两者.
一些自动合并工具将比较数据的两个冲突版本,如果没有单个字段冲突,那么数据将在没有用户帮助的情况下自动合并.这是大多数软件版本控制系统所做的.不幸的是,用户通常能够更好地决定何时出现冲突而不是程序,只是因为.java文件的两个版本没有改变相同的代码行并不意味着没有冲突,第一个用户可能已经删除了另一个用户添加了一个引用方法的方法,以及导致典型的每晚构建经常中断的几个其他可能的问题.
JB *_*zet 10
用户将关心该消息,因为他想进行一些修改,并且尚未进行修改.因此,他将刷新页面以查看数据的新状态,并将重做他的修改,或者决定在新状态下不再进行修改.
如果两个用户同时修改实体,如果最后一次修改获胜,那么这是一个问题吗?如果是问题,请使用乐观锁定,并在出现问题时通知用户.没有办法绕过它.
如果这不是问题,那么不要使用乐观锁定.最后一次修改,如果不破坏数据库中的约束,将始终获胜.但是,并发用户修改相同的数据将始终导致异常(例如,因为某些用户可能会在其他用户向同一实体提交修改之前删除实体).
重试不是一个选项:
您的问题可以通过汽车类比来解释.假设您选择购买带限速器的汽车,以确保您不会违反速度限制.现在你问:但我不关心速度限制.我不应该总是禁用限速器吗?你可以,但如果你被警察抓住,不要感到惊讶.
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |