Maison >Problème commun >Qu'est-ce que le verrouillage pessimiste ?

Qu'est-ce que le verrouillage pessimiste ?

Guanhui
Guanhuioriginal
2020-06-28 09:52:594537parcourir

Le verrouillage pessimiste fait référence à une attitude conservatrice à l'égard des données modifiées par le monde extérieur. Cela signifie que les données sont verrouillées pendant le processus de traitement des données, sinon cette fonction doit s'appuyer sur le mécanisme de verrouillage fourni par la base de données. même s'il est implémenté dans le système. Le mécanisme de verrouillage ne peut garantir que les données ne seront pas modifiées par des systèmes externes.

Qu'est-ce que le verrouillage pessimiste ?

Mode de verrouillage

LockMode.NONE

Aucun mécanisme de verrouillage

LockMode.READ

Hibernate acquiert automatiquement le verrou lors de la lecture de l'enregistrement

C'est-à-dire le verrouillage partagé : (verrouillage partagé, verrouillage S), le verrouillage partagé est également appelé verrouillage en lecture. Si la transaction T acquiert le verrou partagé sur l'objet de données A (c'est-à-dire en ajoutant un verrou partagé à A), alors les autres transactions ne peuvent acquérir que le verrou partagé (verrou S) sur A, mais ne peuvent pas ajouter de verrou exclusif (verrou X). Jusqu'à ce que A libère tous les verrous partagés. Les transactions bénéficiant de verrous partagés peuvent uniquement lire des données et ne peuvent pas les modifier.

LockMode.WRITE

Hibernate acquiert automatiquement le verrou lors de l'insertion de l'enregistrement de mise à jour

C'est-à-dire un verrouillage exclusif : (verrouillage exclusif, verrouillage X), le verrouillage exclusif est également appelé verrou d'écriture. Si la transaction T acquiert le verrou exclusif sur les données A, alors T peut à la fois lire et écrire A, mais jusqu'à ce que T libère le verrou X sur A, les autres transactions ne peuvent acquérir ni le verrou partagé sur A ni le verrou X sur A. Verrou exclusif.

LockMode.UPGRADE

Si le système de base de données prend en charge le verrouillage pessimiste (comme Oracle et MySQL), exécutez l'instruction select...for update (verrouillage au niveau de la ligne, les autres transactions ne peuvent pas être mises à jour ou insérez-le) et supprimez l'instruction), si la base de données ne prend pas en charge le verrouillage pessimiste (comme Sybase), une instruction select ordinaire est exécutée.

LockMode.UPGRADE_NOWAIT

a la même fonctionnalité que LockMode.UPGRADE. De plus, exécutez l’instruction select...for update nowait pour la base de données Oracle. "nowait" signifie que si la transaction exécutant l'instruction select ne peut pas obtenir le verrou pessimiste immédiatement, elle n'attendra pas que d'autres transactions libèrent le verrou, mais lèvera immédiatement une exception de verrouillage.

Démonstration du verrouillage

Remarque : Le verrouillage ne fonctionne que sur les objets de données opérés dans une transaction, et ne fonctionne pas sur l'ensemble de la base de données verrouillée.

Ouvrez deux interfaces de ligne d'opération de commande SQL, qui peuvent représenter deux transactions T1 et T2. Nous exécutons d'abord les commandes dans les deux interfaces : start transaction ;

Dans la transaction T1, interrogeons les informations sur l'étudiant avec le numéro d'étudiant "2015" dans la base de données et ajoutons un verrou pessimiste aux données opérées : sélectionnez * from stu_info où stu_no="2015" pour la mise à jour ;. À ce moment, nous pouvons interroger les informations correspondantes.

"pour mise à jour" signifie ajouter un verrouillage pessimiste. La transaction n'est pas soumise après cette requête, ce qui signifie que le verrou n'a pas encore été libéré

Dans la transaction T2, interrogez les informations sur l'étudiant avec le numéro d'étudiant "2016" dans la base de données et ajoutez un verrou pessimiste au données exploitées : sélectionnez * depuis stu_info où stu_no="2016" pour la mise à jour ;. A ce moment, nous pouvons également interroger les informations correspondantes.

La transaction n'a pas encore été soumise

Dans la transaction T2, interrogez les informations sur l'étudiant avec le numéro d'étudiant "2015" dans la base de données. Cette fois, effectuez une requête de sélection ordinaire sans verrouillage : select. * de stu_info où stu_no=”2015”;. A ce moment, nous pouvons également interroger les informations correspondantes.

La transaction n'a pas encore été validée

Dans la transaction T2, essayez d'interroger les informations sur l'élève du numéro de collège "2015" dans la base de données et ajoutez un verrou pessimiste aux données opérées : sélectionnez * depuis stu_info où stu_no=" 2015" pour la mise à jour ;. À ce moment-là, nous pouvons constater que les informations pertinentes ne sont pas affichées, mais sont en attente. Lorsque nous soumettons la transaction T1 (c'est-à-dire : commit), l'objet de données « 2015 » libère le verrou pessimiste dans T1, afin que la transaction T2 puisse interroger les informations pertinentes et obtenir le verrou pessimiste.

Si on change l'étape 5. Dans la cinquième étape tout à l'heure, nous avons modifié le numéro d'étudiant en "2016" dans la transaction T1 mais n'avons pas ajouté de verrou pessimiste, car nous avions précédemment ajouté un verrou pessimiste à l'enregistrement dans la transaction T2 et il n'a pas été libéré, nous ne peut qu'attendre. La modification ne peut réussir qu'après la soumission du T2.

Tutoriel recommandé : "Tutoriel MySQL"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn