当我试图在事务性服务(grails2.3.8)中锁定域对象时,我正在接收一个StaleObjectStateException:
@Transactional
class AnalyticsService {
boolean newStreamView(Long streamId) {
Stream stream = Stream.lock(streamId) // The exception is launched here当然,只有在多个并发调用该服务的情况下才会发生这种情况。正如我所看到的,hibernate试图使用ID和版本参数锁定:
select id from stream where id =442 and version =305 for update但这失败了。如果禁用域类中的乐观锁定(version: false),一切正常(hibernate只使用id锁定行)。
正如在马克·帕尔默的博客中发布的那样:
在保持乐观锁定的同时避免StaleObjectException的唯一万无一失的方法是在事务中完成所有GORM工作,并且始终使用Domain.lock(id)加载对象。在使用动态查找器或条件时,需要指定“lock”选项,以便将结果预先锁定。
他说我们应该保持乐观。
有什么安全的方法来避免StaleObjectStateException的锁定和乐观锁定吗?
如果我禁用乐观锁定(版本: false),还会出现哪些其他问题。我很担心这一点,因为这个域类是从其他服务中更新的?
提前谢谢。
发布于 2018-04-03 16:26:07
我们100%地通过以下方法修正了StaleStateException/OptimisticLocking问题:
https://stackoverflow.com/questions/25301785
复制相似问题