Comment implémenter correctement le verrouillage optimiste dans MySQL?
Notre équipe a déduit que nous devons faire # 4 ci-dessous, sinon il y a un risque qu'un autre thread puisse mettre à jour la même version de l'enregistrement, mais nous aimerions valider que c'est la meilleure façon de le faire.
- Créez un champ de version sur la table que vous souhaitez utiliser un verrouillage optimiste pour par exemple le nom de colonne = "version"
- Sur les sélections, assurez-vous d'inclure la colonne de version et notez la version
- Lors d'une mise à jour ultérieure de l'enregistrement, l'instruction de mise à jour doit émettre "où version = X" où X est la version que nous avons reçue dans # 2 et définir le champ de version pendant cette instruction de mise à jour sur X + 1.
- Effectuez une
SELECT FOR UPDATE
sur l'enregistrement que nous allons mettre à jour afin de sérialiser qui peut apporter des modifications à l'enregistrement que nous essayons de mettre à jour.
Pour clarifier, nous essayons d'empêcher deux threads qui sélectionnent le même enregistrement dans la même fenêtre de temps où ils saisissent la même version de l'enregistrement de se remplacer les uns les autres s'ils devaient essayer de mettre à jour l'enregistrement en même temps. Nous pensons que si nous ne faisons pas # 4, il y a une chance que si les deux threads entrent leurs transactions respectives en même temps (mais n'ont pas encore publié leurs mises à jour), quand ils vont mettre à jour, le deuxième thread qui utilisera la MISE À JOUR ... où version = X fonctionnera sur les anciennes données.
Avons-nous raison de penser que nous devons effectuer ce verrouillage pessimiste lors de la mise à jour, même si nous utilisons des champs de version / verrouillage optimiste?
SELECT ... FOR UPDATE
verrouillage optimiste ou par version de ligne, pas des deux. Voir détail en réponse.