2011-06-10 24 views
2

我正在使用锁!在我的代码中,并希望捕获如果锁定引发的异常!由于某种原因失败(例如无法获得锁定)。什么样的例外可以锁定!扔?我检查了红宝石文档,但无法找到特定的Exception类。ActiveRecord :: lock!引发了什么样的异常?

谢谢。

回答

1

这是源代码locking call。它要求重装,其源看起来是这样的:

  # File lib/active_record/base.rb, line 2333 
2333:  def reload(options = nil) 
2334:   clear_aggregation_cache 
2335:   clear_association_cache 
2336:   @attributes.update(self.class.find(self.id, options).instance_variable_get('@attributes')) 
2337:   @attributes_cache = {} 
2338:   self 
2339:  end 

所以当你调用重载(:锁定=>锁)作为呼叫锁定做它真的更新该记录的属性。

这里有很多不同的情况。您可以尝试锁定dosnt存在的记录,或锁定其他地方锁定的记录。你有什么错误感兴趣?

+0

记录不存在时的错误以及记录是否已锁定在别处。相应的例外的名称是什么,所以我可以相应地限制我的救援声明? – deruse 2011-06-11 00:41:33

+0

好问题,我相信你想赶上'RecordNotFound'和'StaleObjectError'。 AR将提出的所有错误可以在以下网址找到:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/errors.rb – 2011-06-11 01:30:38

1

如有疑问,请探讨。

考虑以下对功能:

def long_hold 
    ActiveRecord::Base.transaction do 
    u = User.find(220) 
    u.lock! 
    sleep 100.seconds 
    u.email="[email protected]" 
    u.save! 
    end 
end 

def short_hold 
    ActiveRecord::Base.transaction do 
    u = User.find(220) 
    u.lock! 
    u.email="[email protected]" 
    u.save! 
    end 
end 

以我设置(OSX 10.11,红宝石2.2.4,导轨4.2,9.5 Postgres的),运行在long_hold一个导轨控制台,然后在第二运行short_hold控制台,我观察short_hold块,直到long_hold完成;此外,通过放入代码,我们看到虽然long_hold正在休眠,但short_hold正在等待获取锁定。

假设没有关于滑轨控制台独立性的警告,这表明如果第二个进程试图锁定已锁定的行,但该进程阻塞直到第一个完成,则不会引发异常。

相关问题