Mysql2::Erreur: Impasse trouvé lorsque vous essayez d'obtenir le verrou; essayez de redémarrer transaction: INSERT INTO
Récemment, j'ai trouvé beaucoup d'erreurs de blocage dans mon application.
Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: INSERT INTO `products`....
le code comme ci-dessous:
Après que l'utilisateur a été créé, je vais ajouter quelques produits à l'utilisateur. Je ne comprends pas pourquoi blocage qui s'est passé.
class User < ActiveRecord::Base
after_create :add_products
has_many :products, :dependent => :destroy
def self.create_user
User.create!(.......)
end
def add_products
Product.add(self, "product_name", 10)
end
.....
end
class Product < ActiveRecord::Base
belongs_to :user
def self.add(user, product_name, amount)
transaction do
product = user.products.find_by_product_name(product_name)
if product
product.increment :amount, amount
product.save!
else
product = self.create! user_id: user.id,
product_name: product_name,
amount: amount
end
end
product
end
end
Je n'ai pas trouver la cause, quelqu'un peut-il me donner quelques conseils? Merci à l'avance!!!!!
- Dans la méthode add, Pourquoi êtes-vous à l'aide de l'auto de nouveau.? Utiliser le Produit à la place.
- Vous avez raison, j'ai déjà modifié.
- Veuillez consulter le lien suivant, cela vous aidera à stackoverflow.com/questions/2332768/...
- Donc, mon commentaire a été la réponse..?
- ne suis pas sûr, pouvez-vous expliquer pourquoi peut conduire à une impasse?
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous utilisez InnoDB et probablement faire des insertions simultanées.
De retracer et de comprendre la cause caisse ces articles
mysql blocages avec insertions simultanées
traitant de blocage
Une façon de résoudre le problème est de réessayer comme le code ci-dessous
Ou il y a quelques perles comme la transaction_query pour gérer MySQL blocages.
Cela m'a permis d'économiser beaucoup de maux de tête: transaction_retry ruby gem.
De le README de la gemme: