繁体   English   中英

Rails 2.3-在模型中处理ActiveRecord :: StatementInvalid

[英]Rails 2.3 - Handling ActiveRecord::StatementInvalid within the model

我的Rails应用程序中的模型开始抛出ActiveRecord :: StatementInvalid并显示以下消息:“ Mysql :: Error:尝试获取锁时发现了死锁;尝试重新启动事务...”无论如何,我最初的处理方式是:

myModel.update/save/update_all

我包装它来捕获该异常,例如:

begin
  myModel.update_all(..) 
rescue Exception => e
  if e.message.include?("Deadlock")
    retry
  end
end

这样做的问题是,我必须在有更新/保存的所有地方都挽救该异常,并且必须小心,重试会做两次甚至更糟的事情,从而陷入无限循环。 我可以像在回调中那样在模型级别的一个位置上解决此问题的方法吗? 似乎after_save或after_update无法解决问题,因为此时尚未引发异常。 我在Rails 2.3.8中,因此after_commit或after_rollback对我来说不是一个选择。 有任何想法吗? 谢谢! ps:我知道有一些方法可以避免或减少mysql出现死锁的机会,但是我可以在死锁发生后重新启动事务,因为在我看来,死锁不会经常发生

也许您可以在ApplicationController中尝试“ rescue_from”,如下所示:

class ApplicationController < ActionController::Base

    rescue_from ActiveRecord::StatementInvalid, :with => :my_custom_error_handler


    protected

    def my_custom_error_handler(exception)
      ...
    end
end

但是我不确定它是否可以正确处理您的重试。 值得一试。 让我知道!

我想我会和这个宝石一起解决死锁问题https://github.com/mperham/deadlock_retry

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM