簡體   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