12
votes

Activerecord3 Deadlock Réessayer

Y a-t-il des plug-ins pour les rails 3 (ou ActiveRecord 3) qui reproduisent l'ancien Dimeldlock_Rretury Plugin? Ou, ce plugin fonctionne-t-il toujours avec des rails 3?


0 commentaires

3 Réponses :


10
votes

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

Voici ce que nous utilisons (mais vous devez envelopper des requêtes sujettes à impression deadlock-vous-même): P>

# 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 commentaires

Cela m'a juste sauvé un mal de tête. Merci.



8
votes

Il y a un transaction_retry GEM qui fonctionne non seulement avec des rails 3+ mais prend en charge toutes les principales bases de données (mysql, postgregesql et sqlite) . Il est commercialisé comme propre et bien testé.


2 commentaires

HMM, dernier commit a été juin 2018, mais avant que c'était juin 2013. Une fenêtre de 5 ans où rien n'était fait à la gemme. Je suis sceptique. J'aimerais entendre si quelqu'un l'a solidement travaillant dans des rails 4+.


Nous essayons sur nos rails 4.2.11 application actuellement et il semble fonctionner très bien. Il a complètement résolu nos problèmes d'impasse que nous avons constatés lors d'importations intensives et simultanées et ne semble pas causer d'autres problèmes autant que nous puissions le dire.



2
votes

Rails / Deadlock_Rretury

"Deadlock Réessayer permet à l'adaptateur de base de données (actuellement uniquement testé avec le Mysqladapter) pour réessayer les transactions qui tombent dans une impasse. Ça va réessayer de telles transactions trois fois avant de finalement échouer.

Cette fonctionnalité est automatiquement ajoutée à ActiveRecord. Aucun changement de code ou autrement n'est requis. "


2 commentaires

Re "Cette fonctionnalité est automatiquement ajoutée à ActiveRecord" - essayer de trouver la source confirmant cela, Google-Fu vous rabaisse. Pouvez-vous me signaler une description de cela dans AR Core?


Je suis peut-être mal compris - la gemme référencée (rails / Deadlock_Rretury) par l'affiche ajoute automatiquement ceci à l'enregistrement actif