Lorsque vous traitez des conflits, vous avez deux options:
- Vous pouvez essayer d'éviter le conflit, et c'est ce que fait le verrouillage pessimiste.
- Ou, vous pouvez permettre au conflit de se produire, mais vous devez le détecter lors de la validation de vos transactions, et c'est ce que fait le verrouillage optimiste.
Maintenant, considérons l' anomalie de mise à jour perdue suivante :
L'anomalie de mise à jour perdue peut se produire au niveau d'isolement de lecture validée.
Dans le diagramme ci-dessus, nous pouvons voir qu'Alice croit qu'elle peut lui retirer 40 account
mais ne se rend pas compte que Bob vient de modifier le solde du compte, et maintenant il ne reste que 20 dans ce compte.
Verrouillage pessimiste
Le verrouillage pessimiste atteint cet objectif en prenant un verrou partagé ou en lecture sur le compte afin que Bob ne puisse pas modifier le compte.
Dans le diagramme ci-dessus, Alice et Bob acquerront un verrou de lecture sur la account
ligne du tableau que les deux utilisateurs ont lu. La base de données acquiert ces verrous sur SQL Server lors de l'utilisation de la lecture répétable ou de la sérialisation.
Étant donné qu'Alice et Bob ont lu le account
avec la valeur PK de 1
, aucun d'eux ne peut le modifier jusqu'à ce qu'un utilisateur relâche le verrou de lecture. En effet, une opération d'écriture nécessite une acquisition de verrouillage en écriture / exclusif et les verrous partagés / en lecture empêchent les verrous en écriture / exclusifs.
Ce n'est qu'après qu'Alice a validé sa transaction et que le verrou de lecture a été libéré sur la account
ligne, Bob UPDATE
reprendra et appliquera la modification. Jusqu'à ce qu'Alice libère le verrou de lecture, les mises à jour de Bob se bloquent.
Pour plus de détails sur la façon dont les infrastructures d'accès aux données utilisent la prise en charge du verrouillage pessimiste de la base de données sous-jacente, consultez cet article .
Verrouillage optimiste
Le verrouillage optimiste permet au conflit de se produire mais le détecte lors de l'application de la MISE À JOUR d'Alice car la version a changé.
Cette fois, nous avons une version
colonne supplémentaire . La version
colonne est incrémentée chaque fois qu'un UPDATE ou DELETE est exécuté, et elle est également utilisée dans la clause WHERE des instructions UPDATE et DELETE. Pour que cela fonctionne, nous devons émettre SELECT et lire le courant version
avant d'exécuter UPDATE ou DELETE, car sinon, nous ne saurions pas quelle valeur de version passer à la clause WHERE ou incrémenter.
Pour plus de détails sur la façon dont les infrastructures d'accès aux données implémentent un verrouillage optimiste, consultez cet article .
Transactions au niveau de l'application
Des systèmes de bases de données relationnelles sont apparus à la fin des années 70 et au début des années 80, lorsqu'un client se connectait généralement à un ordinateur central via un terminal. C'est pourquoi nous voyons toujours des systèmes de base de données définir des termes tels que le paramètre SESSION.
De nos jours, sur Internet, nous n'exécutons plus les lectures et les écritures dans le contexte de la même transaction de base de données, et ACID n'est plus suffisant.
Par exemple, considérez le cas d'utilisation suivant:
Sans verrouillage optimiste, il est impossible que cette mise à jour perdue soit interceptée même si les transactions de la base de données utilisaient Serializable. En effet, les lectures et les écritures sont exécutées dans des requêtes HTTP distinctes, donc sur différentes transactions de base de données.
Ainsi, un verrouillage optimiste peut vous aider à éviter les mises à jour perdues même lorsque vous utilisez des transactions au niveau de l'application qui intègrent également le temps de réflexion de l'utilisateur.
Pour plus de détails sur les transactions logiques ou au niveau de l'application, consultez cet article .
Conclusion
Le verrouillage optimiste est une technique très utile, et il fonctionne très bien même lorsque vous utilisez des niveaux d'isolement moins stricts, comme Read Committed, ou lorsque des lectures et des écritures sont exécutées dans des transactions de base de données ultérieures.
L'inconvénient d'un verrouillage optimiste est qu'un retour en arrière sera déclenché par le cadre d'accès aux données lors de la capture d'un OptimisticLockException
, perdant ainsi tout le travail que nous avons effectué précédemment par la transaction en cours d'exécution.
Plus il y a de conflits, plus il y a de conflits et plus les chances d'abandonner des transactions sont grandes. Les annulations peuvent être coûteuses pour le système de base de données car il doit annuler toutes les modifications en cours qui peuvent impliquer à la fois des lignes de table et des enregistrements d'index.
Pour cette raison, le verrouillage pessimiste peut être plus approprié lorsque des conflits surviennent fréquemment, car il réduit les chances de faire reculer les transactions.