2011-10-28 3 views
1

J'essaie de mettre à jour plusieurs lignes dans une table qui correspondent à certains critères (c'est-à-dire toutes les lignes où some_col = "foo"). Je veux faire cette mise à jour dans le cadre d'une transaction dans laquelle j'achète un verrou en mode partage sur toutes ces lignes, mise à jour ligne par ligne et libère les verrous partagés.activerecord verrouiller plusieurs lignes à la fois

La documentation que j'ai lue jusqu'à présent explique comment verrouiller des lignes individuelles dans ActiveRecord. Mais cela rendra les choses inefficaces car je devrai d'abord effectuer une requête .where (...), parcourir chaque ligne et la verrouiller (ce qui restaure la ligne de la base de données). Donc je serai deux fetchs db par ligne ...

Je me demandais quelle est la meilleure façon de verrouiller toutes les lignes qui correspondent à un certain critère dans la requête .where (...) elle-même. Est-ce possible? Si ce n'est pas le cas, existe-t-il de meilleurs moyens de verrouiller plus efficacement un certain ensemble de lignes? Verrouiller la table n'est pas une option.

Merci!

Répondre

3

Essayez cette

http://guides.rubyonrails.org/active_record_querying.html#pessimistic-locking

Je suppose que nous votre modèle est Item comme dans l'exemple, faire quelque chose comme:

Item.lock.joins .... 

E.T.C. et construisez la sélection que vous voulez afin que vous apportiez toutes les lignes dans une grande vue/résultat.

Cela pourrait être ce que vous voulez.

+0

Est-ce que cela fonctionne avec la méthode .where? J'ai juste besoin de sélectionner plusieurs lignes dans une seule table, donc je ne veux pas supporter le surcoût des jointures. J'ai essayé d'utiliser Item.lock.where (: conditions) mais cela ne fonctionne pas. Suggestions? – deruse

+0

Ça devrait marcher. J'ai juste essayé cela sur un de mes projets et cela a fonctionné. Quand vous dites que cela ne fonctionne pas, quelle erreur obtenez-vous? –

+0

Nvm ur ça marche. – deruse

Questions connexes