2013-10-16 2 views
1

J'ai une table sur laquelle je veux lancer une migration assez longue (~ 20 min). Pendant ce temps, le contenu de la table ne doit pas être modifié du tout. Cependant, les rails de cette table (et beaucoup d'autres) resteront éteints pendant que la migration est en cours et il y a une chance très réelle que quelqu'un essaye de modifier certaines données (c'est bien si cet appel finit par jeter une erreur).Verrouiller une table avec des rails

Nous utilisons MySQL et autorisons 10 connexions dans notre pool de connexions. Ai-je raison de supposer que ce n'est pas suffisant pour envelopper cette migration dans une transaction, mais que je devrais verrouiller la table elle-même?

Répondre

2

Si vous voulez vraiment vous assurer qu'aucune modification ne se produise à la table, le plus sûr est de verrouiller la table au niveau mysql.

Si, toutefois, vous souhaitez simplement vous assurer qu'aucune écriture/écrasement concurrent ne se produit, vous pouvez également utiliser optimistic locking. Une chose à mentionner est que cela pourrait signifier que le script d'importation va se plaindre et que certaines sauvegardes pourraient échouer, car entre la lecture et l'écriture, le frontal aurait pu changer l'enregistrement.

En supposant que ce serait bien et vous pouvez simplement répéter ces écritures individuelles, voici comment cela fonctionnerait:

Par convention, vous devez ajouter une colonne entière appelée lock_version à la table en question et vous êtes magiquement mis dans la façon dont nous aimons des rails.

Il ya un peu plus à ce que je vous encourage à lire dans le linked documentation et que nous pouvons discuter dans les commentaires si vous le souhaitez.

+0

merci. C'était exactement ce que je cherchais. – Reck

Questions connexes