Cet article vous pose quelques questions sur le niveau d'isolation des transactions MySQL et comment MVCC l'implémente. J'espère qu'il vous sera utile.
Atomicité (atomicité) : La plus petite unité de travail d'une transaction, soit tout succès, soit tout échec.
Cohérence : Après le début et la fin de la transaction, l'intégrité de la base de données ne sera pas détruite.
Isolement : Différentes transactions ne s'affectent pas les unes les autres. Les quatre niveaux d'isolement sont RU (Lecture non validée), RC (Lecture validée), RR (Lecture répétable), SERIALIZABLE (Changement en série).
Durabilité : Une fois la transaction soumise, la modification des données est permanente et ne sera pas perdue même en cas de panne du système.
Lecture non validée/RU
Également connue sous le nom de lecture sale, une transaction peut lire les données non validées d'une autre transaction. Ce niveau d'isolement est le moins sécurisé car les transactions non validées sont sujettes à une restauration.
Lecture validée/RC
Également connue sous le nom de Lecture non répétable, une transaction lit les données modifiées qui ont été soumises par une autre transaction, ce qui entraîne la lecture du même élément à des moments différents dans la transaction en cours. Résultats de l'acquisition de données sont incohérents.
Par exemple, dans l'exemple suivant, vous constaterez que SessionA interroge deux fois des données différentes au cours d'une transaction. La raison en est que le niveau d'isolement actuel est RC et que la transaction de SessionA peut lire les dernières données soumises par SessionB.
Heure d'occurrence | SessionA | SessionB |
---|---|---|
1 | begin; |
|
2 | sélectionnez * de l'utilisateur où id=1 ;( Zhang San) | |
3 | mettre à jour le nom de l'ensemble d'utilisateurs = '李思' où id=1 (validation de transaction implicite par défaut) | |
4 | sélectionner * de l'utilisateur où id = 1;(李思) | |
5 | mettre à jour le nom de l'ensemble d'utilisateurs='王二' où id=1;(transaction de validation implicite par défaut) | |
6 | select * from user où id=1;(王二) |
Lecture répétable/RR)
également connue sous le nom delecture fantôme, une lecture de transaction peut lire d'autres validations de transaction. Cependant, sous le niveau d'isolement RR, ces données ne peuvent être lues qu'une seule fois.Dans la transaction en cours, quel que soit le nombre de lectures, les données sont toujours la valeur lue pour la première fois.Après une lecture, d'autres transactions modifient et valident les données pour produire des modifications. Par conséquent, cela devient également une lecture fantôme, car les données lues ne sont pas nécessairement les données les plus récentes.
Par exemple : lorsque les données sont lues pour la première fois dans SessionA, les transactions ultérieures qui modifient les données soumises n'affecteront pas la valeur des données lues par SessionA. C'est reproductible.
Heure d'occurrence | SessionA | SessionB |
---|---|---|
1 | begin; |
|
2 | sélectionnez * de l'utilisateur où id=1 ;( Zhang San) | |
3 | mettre à jour le nom de l'ensemble d'utilisateurs='李思' où id=1 (soumission de transaction implicite par défaut) | |
4 | sélectionnez * de l'utilisateur où id = 1;(Zhang San) | |
5 | mettre à jour le nom de l'ensemble d'utilisateurs = '王二' où id=1;(Validation de transaction implicite par défaut) | |
6 | sélectionner * de l'utilisateur où id=1;(Zhang San) |
Sérialisable
Toutes les opérations de lecture ou d'écriture de la base de données sont exécutées en série, et une seule est prise en charge sous le niveau d'isolement actuel. Les requêtes sont exécutées simultanément, et toutes les opérations nécessitent une exécution en file d'attente. Par conséquent, toutes les données sous ce niveau d’isolement sont les plus stables, mais les performances sont également les pires. L'implémentation du verrouillage de la base de données est une version à plus petite granularité de ce niveau d'isolement.
Heure d'occurrence | SessionA | SessionB |
---|---|---|
1 | begin; |
|
2 | commencer; | |
3 | mettre à jour le nom de l'utilisateur ='李思' où id=1; | |
4 | sélectionnez * de l'utilisateur où id=1;(attendez, attendez) | |
5 | |
commit; |
6 | sélectionnez * de l'utilisateur où id=1;(李思) |
Exemple :
Heure d'occurrence | SessionA | SessionB |
---|---|---|
1 | begin " | Vérifier le solde = 1000 yuans|
5 | Le montant du dépôt est de 100 yuans et le solde modifié est de 1100 yuans | |
6 | Retirez 100 yuans en espèces, et le solde modifié est de 900 yuans en ce moment |
|
8 | | Soumettre la transaction (Solde = 1100) |
9 |
Soumettre la transaction (Solde = 900) |
|
SessionA |
|
SessionB |
1 |
début ; |
commencer; | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Vérifier le solde = 1000 yuans | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retirez 100 yuans en espèces, et le solde modifié est de 900 yuans à ce moment-là | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Soumettre la transaction (solde = 1100) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Annuler la transaction ( solde rétabli à 1000 yuans) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Time | Trans action 777 | Transaction 888 | Trasaction 999 | |||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
T1 | begin; | |||||||||||||||||||||||||||||||||||||||||||||
T2 | commencer; | commencer; | ||||||||||||||||||||||||||||||||||||||||||||
T3 | METTRE À JOUR le nom de l'utilisateur SET = 'CR7' OÙ id = 1; DATE nom de l'utilisateur SET = 'Messi ' OÙ id = 1; | SELECT * FROM utilisateur où id = 1; |
||||||||||||||||||||||||||||||||||||||||||||
commit; | ||||||||||||||||||||||||||||||||||||||||||||||
MISE À JOUR du nom de l'utilisateur SET = 'Neymar' OÙ id = 1; |
||||||||||||||||||||||||||||||||||||||||||||||
T8 |
SELECT * FROM utilisateur où id = 1; |
|||||||||||||||||||||||||||||||||||||||||||||
T9 |
| MISE À JOUR du nom de l'utilisateur SET = 'Dybala ' OÙ id = 1;|||||||||||||||||||||||||||||||||||||||||||||
SELECT * FROM utilisateur où id = 1; | ||||||||||||||||||||||||||||||||||||||||||||||
Time | Transaction 777 | Trans action 888 | Trasaction 999 |
---|---|---|---|
T1 | begin; | ||
T2 | |
commencer; | commencer; |
T3 | METTRE À JOUR le nom de l'utilisateur SET = 'CR7' OÙ id = 1; Nom de l'utilisateur ATE = 'Messi' OÙ id = 1; | SELECT * FROM utilisateur où id = 1; |
|
commit; | |||
UPDATE nom de l'utilisateur SET = ' Neymar' OÙ id = 1; |
|||
T8 |
SELECT * FROM utilisateur où id = 1; |
||
T9 | UP DATE nom de l'utilisateur SET = 'Dybala ' OÙ identifiant = 1; | ECT * FROM utilisateur où id = 1;||
Chaîne de version actuelle : | m_ids est : [777,888], donc le. les données interrogées selon la version visible de ReadView sont Mbappe. |
Instruction SELECT au moment T8 : | |
Dans la transaction en cours 999 à ce moment. Étant donné que ReadView a été généré au moment T5, ReadView ne sera généré qu'une seule fois dans la transaction en cours, donc les m_ids à T5 sont toujours utilisés à ce moment : [777,999] | , donc les données de requête à ce moment sont toujours Mbappe. Instruction SELECT au moment T11 : | Chaîne de la version actuelle : ||
La situation à ce moment est exactement la même que celle de T8. Étant donné que ReadView a été généré au moment T5, ReadView ne sera généré qu'une seule fois dans la transaction en cours, donc les | m_ids à T5 sont toujours utilisés à ce moment : [777,999], donc les données de requête à ce moment sont toujours Mbappe. |
Résumé MVCC : | |
REPEATABLE READ | pour exécuter des transactions ordinaires. L'opération SEELCT est le processus d'accès à la chaîne de versions enregistrées, qui permet aux opérations de différentes transactions d'être exécutées simultanément, améliorant ainsi les performances du système. | Apprentissage recommandé : Tutoriel vidéo 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!