我正在使用锁!在我的代码中,并希望捕获如果锁定引发的异常!由于某种原因失败(例如无法获得锁定)。什么样的例外可以锁定!扔?我检查了红宝石文档,但无法找到特定的Exception类。ActiveRecord :: lock!引发了什么样的异常?
谢谢。
我正在使用锁!在我的代码中,并希望捕获如果锁定引发的异常!由于某种原因失败(例如无法获得锁定)。什么样的例外可以锁定!扔?我检查了红宝石文档,但无法找到特定的Exception类。ActiveRecord :: lock!引发了什么样的异常?
谢谢。
这是源代码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存在的记录,或锁定其他地方锁定的记录。你有什么错误感兴趣?
如有疑问,请探讨。
考虑以下对功能:
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
正在等待获取锁定。
假设没有关于滑轨控制台独立性的警告,这表明如果第二个进程试图锁定已锁定的行,但该进程阻塞直到第一个完成,则不会引发异常。
记录不存在时的错误以及记录是否已锁定在别处。相应的例外的名称是什么,所以我可以相应地限制我的救援声明? – deruse 2011-06-11 00:41:33
好问题,我相信你想赶上'RecordNotFound'和'StaleObjectError'。 AR将提出的所有错误可以在以下网址找到:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/errors.rb – 2011-06-11 01:30:38