【发布时间】:2010-07-09 17:09:15
【问题描述】:
我已经阅读了hibernate docs about concurrency 并且我认为我已经理解了available locking methods,但是我不确定我应该如何实现以下场景。
两个客户端 F(快)和 S(慢)访问数据库并可以修改相同的对象。
现在,还有一个额外要求:客户端 F 尽可能快地执行对应用程序至关重要。
你会如何解决这个问题?
我的乐观锁定问题: 假设 F 尝试更新其更改但无法成功执行此操作,因为 S 已经更新了其数据。一个异常 (StaleObjectStateException) 将从休眠中抛出。我将捕获此异常并合并更改并再次尝试完全相同的事务,对吗?然后我不喜欢 F 在成功之前重试其事务的情况,因此 F 理论上可以阻塞很长时间。我应该忽略这一点并希望这种情况在实践中很少见吗?或者我可以给我的客户一些类似数据库锁定优先级的东西吗?
Other users 可以忍受这个问题:
StaleObjectStateException(乐观锁定)...我们每 10000 次调用就会出现 3 个异常。
【问题讨论】:
-
如果所有线程都能够在不访问数据的情况下完成它们的工作(即修改数据库),您的应用程序是否还有问题?似乎确实如此。似乎您是在说 C 正在以某种方式修改数据库,导致 B 在没有合并的情况下无法正确完成未来的事务?也许有办法解决这个问题?有没有办法修改环境,让并发修改成为唯一的问题?
-
抱歉,描述不清楚:我的意思是“异常”是 OptimisticLockException 或 StaleObjectStateException(一个对象的不同版本)而不是应用程序异常
标签: database performance hibernate concurrency locking