2010-10-26 14 views

Odpowiedz

10

ja nawet nie wiem, nie było wtyczki do tego :)

Tutaj robić to co używamy (ale trzeba owinąć zapytań impasu podatnych na to sam):

# 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

To właśnie uratowało mi ból głowy. Dziękuję Ci. –

6

There jest klejnotem transaction_retry, który nie tylko działa z Railsami 3+, ale obsługuje wszystkie główne bazy danych (MySQL, PostgreSQL i SQLite). Jest sprzedawany jako czysty i dobrze przetestowany.

2

rails/deadlock_retry

„Deadlock ponawiania umożliwia adapter bazy danych (obecnie tylko przetestowane z MySQLAdapter), aby ponowić próbę transakcji, które mieszczą się w martwym punkcie. Będzie ponowić takich transakcji trzy razy, zanim ostatecznie niepowodzeniem.

ten Funkcja jest automatycznie dodawana do ActiveRecord i nie wymaga żadnych zmian kodu. "

+0

re "Ta funkcja jest automatycznie dodawana do ActiveRecord" - próbuje znaleźć źródło potwierdzające to, google-fu mnie zawodzi. Czy możesz wskazać mi na opis tego w rdzeniu AR? –

+0

Cienki, być może źle zrozumiałeś - odnośnik do klejnotu (tory/deadlock_retry) przez plakat automatycznie dodaje go do aktywnego rekordu –

Powiązane problemy