2010-10-26 4 views

Répondre

10

Je ne savais même pas qu'il y avait un plugin pour le faire :)

Voici ce que nous utilisons (mais vous devez envelopper les requêtes sujettes à impasse dans vous-même):

# 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

Cela m'a juste sauvé un mal de tête. Je vous remercie. –

6

Il est un gem transaction_retry qui fonctionne non seulement avec Rails 3+ mais supporte toutes les bases de données majeures (MySQL, PostgreSQL et SQLite). Il est commercialisé comme propre et bien testé.

2

rails/deadlock_retry

« nouvelle tentative Deadlock permet à l'adaptateur de base de données (actuellement testé uniquement avec le MySQLAdapter) pour tenter de nouvelles transactions qui tombent dans l'impasse. Il réessaiera ces opérations trois fois avant d'échouer.

Cette La capacité est automatiquement ajoutée à ActiveRecord, aucun code n'est modifié ou est requis.

+0

re "Cette fonctionnalité est automatiquement ajoutée à ActiveRecord" - en essayant de trouver la source confirmant cela, google-fu à défaut de moi. Pouvez-vous me montrer une description de ceci dans le noyau AR? –

+0

Je mince peut-être vous mal compris --- la gemme référencée (rails/deadlock_retry) par l'affiche ajoute automatiquement à l'enregistrement actif –

Questions connexes