Java 如何处理锁(JPA)?

Java 如何处理锁(JPA)?,java,jpa,locking,openjpa,Java,Jpa,Locking,Openjpa,根据*,处理锁的最佳方法是向用户报告乐观锁错误/异常 问题是它不可伸缩。假设我有许多用户可能使用相同的操作导致锁定。用户不关心锁定错误消息 简言之: 最好的方法是禁用所有锁 最好的方法是向用户报告错误锁定消息?但是用户必须重试他的操作,直到它工作 最好的方法是重试事务,直到没有锁为止 * 处理乐观锁异常 不幸的是,程序员往往过于聪明,不利于自己。使用乐观锁定时出现的第一个问题是发生OptimisticLockException时该怎么办。友好的超级程序员的典型反应是自动处理异常。他们只需创

根据*,处理锁的最佳方法是向用户报告乐观锁错误/异常

问题是它不可伸缩。假设我有许多用户可能使用相同的操作导致锁定。用户不关心锁定错误消息

简言之:

  • 最好的方法是禁用所有锁
  • 最好的方法是向用户报告错误锁定消息?但是用户必须重试他的操作,直到它工作
  • 最好的方法是重试事务,直到没有锁为止

*

处理乐观锁异常

不幸的是,程序员往往过于聪明,不利于自己。使用乐观锁定时出现的第一个问题是发生OptimisticLockException时该怎么办。友好的超级程序员的典型反应是自动处理异常。他们只需创建一个新事务,刷新对象以重置其版本,然后将数据合并回对象并重新提交。普雷斯托问题解决了,还是真的解决了

这实际上从一开始就破坏了锁定的全部意义。如果这是您所希望的,那么您也可以不使用锁定。不幸的是,OptimisticLockException很少会被自动处理,您真的需要麻烦用户解决这个问题。您应该向用户报告冲突,或者说“对不起,发生了编辑冲突,他们将不得不重做他们的工作”,或者在最好的情况下,刷新对象并向用户提供当前数据和他们提交的数据,并在适当的情况下帮助他们合并这两个数据

一些自动合并工具将比较数据的两个冲突版本,如果各个字段都不冲突,那么数据将在没有用户帮助的情况下自动合并。这是大多数软件版本控制系统所做的。不幸的是,用户通常比程序更能判断什么时候发生冲突,仅仅因为.java文件的两个版本没有更改同一行代码并不意味着没有冲突,第一个用户可能删除了另一个用户添加了方法以引用的方法,以及其他一些可能导致通常夜间构建经常中断的问题


用户会关心消息,因为他想做一些修改,但修改还没有完成。因此,他将刷新页面以查看数据的新状态,并将重新进行修改,或者根据新状态决定不再进行修改

如果两个用户同时修改一个实体,如果最后一次修改成功,无论修改是什么,这是否是一个问题?如果出现问题,则使用乐观锁定,并在出现问题时通知用户。这是没有办法的

如果这不是问题,那么不要使用乐观锁定。最后一次修改,如果它没有打破数据库中的约束,将永远获胜。但是让并发用户修改相同的数据总是会导致异常(例如,因为某些用户可能会在其他用户向同一实体提交修改之前删除某个实体)

重试不是一个选项:

  • 要么它会再次失败,因为不可能进行修改
  • 或者它会成功,但首先会打破乐观锁定的观点

你的问题可以用汽车类比来解释。假设你选择买一辆带限速器的车,以确保你不会超速。现在你问:但是我不在乎速度限制。我不应该总是禁用限速器吗?你可以,但是如果你被警察抓住了,不要感到惊讶。

可能是同一作者的重复。我要说的是,它们没有重复,因为一个询问如何禁用,另一个询问带锁的策略。谢谢你的精彩解释