【发布时间】:2014-10-07 17:38:31
【问题描述】:
我在尝试锁定事务服务(grails 2.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
这失败了。如果我禁用该域类中的乐观锁定(版本:false),一切正常(休眠只使用 id 锁定行)。
正如Marc Palmer's Blog 中发布的那样:
在保持乐观锁定开启的同时避免 StaleObjectException(s) 的唯一万无一失的方法是在事务中完成所有 GORM 工作,并始终使用 Domain.lock(id) 加载对象。使用动态查找器或标准时,您需要指定“锁定”选项以预先锁定结果
他说我们应该保持乐观锁定。
是否有任何安全的方法来避免 StaleObjectStateException 与锁定和乐观锁定 ON ?
如果我禁用乐观锁定(版本:false),我会遇到什么其他问题。我对此感到担忧,因为此域类是从其他服务更新的?
提前致谢。
【问题讨论】:
标签: java multithreading hibernate grails