2010-10-26 12 views

Respuesta

10

Yo ni siquiera sabía que había un plugin para hacer esto :)

Aquí es lo que usar (pero hay que envolver las consultas de punto muerto propensas a usted mismo):

# 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

Esto me salvó un dolor de cabeza. Gracias. –

6

Hay es una gema transaction_retry que no solo funciona con Rails 3+ sino que es compatible con todas las bases de datos principales (MySQL, PostgreSQL y SQLite). Se comercializa como limpio y bien probado.

2

rails/deadlock_retry

"reintento punto muerto permite que el adaptador de base de datos (actualmente sólo probado con el MySQLAdapter) para reintentar las transacciones que caen en punto muerto. Se volverá a intentar dichas transacciones tres veces antes de fallar.

Este la capacidad se agrega automáticamente a ActiveRecord. No hay cambios de código o de lo contrario son necesarios ".

+0

re "Esta capacidad se agrega automáticamente a ActiveRecord" - tratando de encontrar la fuente confirmando esto, google-fu fallando en mí. ¿Puede indicarme una descripción de esto en el núcleo AR? –

+0

Me adelgaza, tal vez lo malinterpretes --- la gema referenciada (carriles/deadlock_retry) por el póster la agrega automáticamente al registro activo –

Cuestiones relacionadas