2010-10-26 82 views

回答

10

我甚至不知道有一個插件來做到這一點:)

下面是我們使用的(但你必須包裝容易導致死鎖的查詢,在它自己):

# Executes the given block +retries+ times (or forever, if explicitly given nil), 
# catching and retrying SQL Deadlock errors. 
def retry_lock_error(retries = 100, &block) 
    begin 
    yield 
    rescue ActiveRecord::StatementInvalid => e 
    if e.message =~ /Deadlock found when trying to get lock/ and (retries.nil? || retries > 0) 
     retry_lock_error(retries ? retries - 1 : nil, &block) 
    else 
     raise e 
    end 
    end 
end 
+1

這只是讓我頭痛。謝謝。 – 2012-10-03 02:50:04

6

有是一個transaction_retry gem,它不僅能夠與Rails 3+一起工作,而且還支持所有主要數據庫(MySQL,PostgreSQL和SQLite)。它被銷售爲乾淨且經過充分測試的產品。

2

rails/deadlock_retry

「死鎖重試允許數據庫適配器(目前只適用於 MySQLAdapter測試)重試落入僵局的交易,這將重試 這樣的交易最終失敗之前的三倍。

這功能會自動添加到ActiveRecord中,不需要更改代碼或其他方式。「

+0

re「這個功能會自動添加到ActiveRecord中」 - 試圖找到確認這一點的源代碼,google-fu讓我失望。你能指出我在AR核心中對此的描述嗎? – 2014-05-14 22:25:09

+0

我也許稀釋了你的誤解---海報引用的(rails/deadlock_retry)自動將這個添加到活動記錄 – 2015-07-21 20:22:42