- PagerDuty /
- Blog /
- Non classé /
- Un meilleur contrôle du verrouillage optimiste dans les rails
Blog
Un meilleur contrôle du verrouillage optimiste dans les rails
Comme à peu près tout le reste dans Rails, verrouillage optimiste C'est simple et rapide à configurer : il suffit d'ajouter une colonne « lock_version » à votre modèle ActiveRecord et le tour est joué. Si un processus Rails tente de mettre à jour un enregistrement et qu'un autre processus parvient discrètement à modifier ce même enregistrement pendant que le premier n'y est pas (verrouillage ?!), le premier processus recevra une erreur ActiveRecord::StaleObjectError lors de la tentative d'enregistrement de ses données obsolètes dans la base de données.
Malheureusement, comme la plupart des fonctionnalités pratiques de Rails, il peut être difficile d'ajuster précisément ce comportement à vos besoins. Imaginez, par exemple, qu'une de vos lignes contienne un champ de données statistiques (comme un compteur), ou toute autre donnée dont (A) la mise à jour peut devenir légèrement obsolète, ou (B) qui doit être mise à jour occasionnellement en arrière-plan sans interférer avec l'enregistrement d'autres mises à jour (plus importantes). Dans ces cas-là, le verrouillage optimiste intégré peut devenir un peu gênant.
Oui, vous pourriez toujours extraire ces champs dans une nouvelle table/un nouveau modèle, avec une relation has_one, mais vous n'avez peut-être pas envie de passer par là. Rassurez-vous ! Grâce au module ci-dessous, il vous suffit d'ajouter les lignes suivantes :
inclure SelectivelyOptimisticallyLockable ignorer_optimistic_locking :nom_de_champ
Dans votre modèle ActiveRecord, toute mise à jour du champ en question n'incrémentera pas le compteur lock_version et ne pourra pas générer d'erreur StaleObjectError. (Testé avec Rails 2.3.X)