我正在尝试锁定事务服务中的域对象(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
然后失败了。如果我在该域类中禁用乐观锁定(version:false),一切正常(hibernate只使用id来锁定行)。
在Marc Palmer's Blog中发布似乎:
在保持乐观锁定ON的同时避免StaleObjectException的唯一简单方法是在事务中执行所有GORM工作,并始终使用Domain.lock(id)加载对象。使用动态查找程序或条件时,您需要指定“锁定”选项以使结果预先锁定
他说我们应该保持乐观锁定。
是否有任何安全的方法可以避免使用锁定和乐观锁定的StaleObjectStateException?
如果我禁用乐观锁定(版本:false),我可以期待其他问题。我很担心这个,因为这个域类是从其他服务更新的?
提前致谢。
答案 0 :(得分:0)
我们通过以下方式解决了100%的StaleStateException / OptimisticLocking问题: