Blog

Plus de contrôle sur le verrouillage optimiste dans Rails

par Jean Laban 10 octobre 2011 | 2 min de lecture

Comme à peu près tout le reste dans Rails, verrouillage optimiste est simple et agréable à configurer : il vous suffit d'ajouter une colonne « lock_version » à votre modèle ActiveRecord et vous êtes prêt. Si un processus Rails donné essaie de mettre à jour un enregistrement et qu'un autre processus parvient discrètement à mettre à jour ce même enregistrement alors que le premier processus ne regardait pas (verrouillage ?!?), alors le premier processus obtiendra une ActiveRecord::StaleObjectError lorsqu'il essaiera de sauvegarder ses données obsolètes dans la base de données.

Malheureusement, comme pour la plupart des autres fonctions pratiques de Rails, il peut être difficile d'ajuster le comportement en fonction de vos besoins. Supposons, par exemple, que votre ligne comporte un champ contenant des données statistiques (comme un compteur), ou une autre donnée qui (A) ne vous dérange pas de la voir devenir un peu obsolète, ou (B) qui doit être occasionnellement mise à jour en arrière-plan et ne doit pas interférer avec la sauvegarde d'autres mises à jour (plus importantes). Dans ces cas, le verrouillage optimiste intégré peut devenir un peu ennuyeux.

Oui, vous pouvez toujours séparer ces champs dans une nouvelle table/un nouveau modèle, avec une relation has_one, mais vous ne voudrez peut-être pas franchir ces obstacles. N'ayez crainte ! En utilisant le module ci-dessous, vous pouvez simplement ajouter les lignes :

 inclure SelectivelyOptimisticallyLockable skip_optimistic_locking :field_name 

dans votre modèle ActiveRecord, toute mise à jour du champ en question n'incrémentera pas votre compteur lock_version et ne pourra pas échouer avec des StaleObjectErrors. (Testé dans Rails 2.3.X)