Existe-t-il des plugins pour Rails 3 (ou ActiveRecord 3) qui répliquent l'ancien plugin deadlock_retry? Ou, ce plugin fonctionne-t-il toujours avec Rails 3?ActiveRecord3 deadlock retry
Répondre
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
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é.
« 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.
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? –
Je mince peut-être vous mal compris --- la gemme référencée (rails/deadlock_retry) par l'affiche ajoute automatiquement à l'enregistrement actif –
Cela m'a juste sauvé un mal de tête. Je vous remercie. –