eko*_*eko 5 java grails multithreading hibernate
我在尝试将域对象锁定在事务服务内部时收到StaleObjectStateException(2.3.8版):
@Transactional
class AnalyticsService {
boolean newStreamView(Long streamId) {
Stream stream = Stream.lock(streamId) // The exception is launched here
Run Code Online (Sandbox Code Playgroud)
当然,只有在有许多并发调用此服务时才会发生这种情况。如我所见,hibernate尝试使用ID和版本参数进行锁定:
select id from stream where id =442 and version =305 for update
Run Code Online (Sandbox Code Playgroud)
这失败了。如果我在该域类中禁用了乐观锁定(版本:false),则一切正常(休眠状态仅使用ID来锁定行)。
正如Marc Palmer的博客中所发布的那样:
在保持乐观锁定为ON的同时避免StaleObjectException(s)的唯一简便方法是完成事务中的所有GORM工作,并始终使用Domain.lock(id)加载对象。使用动态查找器或条件时,您需要指定“锁定”选项以预先锁定结果
他说,我们应该保持乐观的态度。
有没有安全的方法可以避免在锁定和乐观锁定为ON的情况下避免StaleObjectStateException?
如果禁用乐观锁定(版本:false),还会发生什么其他问题。我对此很担心,因为此域类是从其他服务中更新的?
提前致谢。
小智 3
我们通过以下方式修复了 100% 的 StaleStateException/OptimisticLocking 问题: