Parlons du niveau d'isolement atteint par les transactions MySQL et MVCC
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.
Introduction aux transactions de base de données
Quatre caractéristiques majeures des transactions (ACID)
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.
Niveau d'isolement des transactions
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;(李思) |
Transaction et principe MVCC
Problèmes causés par différentes transactions exploitant les mêmes données en même temps
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

HQL et SQL sont comparés dans le framework Hibernate : HQL (1. Syntaxe orientée objet, 2. Requêtes indépendantes de la base de données, 3. Sécurité des types), tandis que SQL exploite directement la base de données (1. Normes indépendantes de la base de données, 2. Exécutable complexe requêtes et manipulation de données).

"Utilisation de l'opération de division dans OracleSQL" Dans OracleSQL, l'opération de division est l'une des opérations mathématiques courantes. Lors de l'interrogation et du traitement des données, les opérations de division peuvent nous aider à calculer le rapport entre les champs ou à dériver la relation logique entre des valeurs spécifiques. Cet article présentera l'utilisation de l'opération de division dans OracleSQL et fournira des exemples de code spécifiques. 1. Deux méthodes d'opérations de division dans OracleSQL Dans OracleSQL, les opérations de division peuvent être effectuées de deux manières différentes.

Oracle et DB2 sont deux systèmes de gestion de bases de données relationnelles couramment utilisés, chacun possédant sa propre syntaxe et ses propres caractéristiques SQL. Cet article comparera et différera la syntaxe SQL d'Oracle et de DB2, et fournira des exemples de code spécifiques. Connexion à la base de données Dans Oracle, utilisez l'instruction suivante pour vous connecter à la base de données : CONNECTusername/password@database Dans DB2, l'instruction pour vous connecter à la base de données est la suivante : CONNECTTOdataba.

Interprétation des balises SQL dynamiques MyBatis : explication détaillée de l'utilisation des balises Set MyBatis est un excellent cadre de couche de persistance. Il fournit une multitude de balises SQL dynamiques et peut construire de manière flexible des instructions d'opération de base de données. Parmi elles, la balise Set est utilisée pour générer la clause SET dans l'instruction UPDATE, qui est très couramment utilisée dans les opérations de mise à jour. Cet article expliquera en détail l'utilisation de la balise Set dans MyBatis et démontrera ses fonctionnalités à travers des exemples de code spécifiques. Qu'est-ce que Set tag Set tag est utilisé dans MyBati

Qu'est-ce que l'identité en SQL ? Des exemples de code spécifiques sont nécessaires. En SQL, l'identité est un type de données spécial utilisé pour générer des nombres à incrémentation automatique. Il est souvent utilisé pour identifier de manière unique chaque ligne de données dans une table. La colonne Identité est souvent utilisée conjointement avec la colonne clé primaire pour garantir que chaque enregistrement possède un identifiant unique. Cet article détaillera comment utiliser Identity et quelques exemples de code pratiques. La manière de base d'utiliser Identity consiste à utiliser Identit lors de la création d'une table.

Lorsque Springboot+Mybatis-plus n'utilise pas d'instructions SQL pour effectuer des opérations d'ajout de plusieurs tables, les problèmes que j'ai rencontrés sont décomposés en simulant la réflexion dans l'environnement de test : Créez un objet BrandDTO avec des paramètres pour simuler le passage des paramètres en arrière-plan. qu'il est extrêmement difficile d'effectuer des opérations multi-tables dans Mybatis-plus. Si vous n'utilisez pas d'outils tels que Mybatis-plus-join, vous pouvez uniquement configurer le fichier Mapper.xml correspondant et configurer le ResultMap malodorant et long, puis. écrivez l'instruction SQL correspondante Bien que cette méthode semble lourde, elle est très flexible et nous permet de

Solution : 1. Vérifiez si l'utilisateur connecté dispose des autorisations suffisantes pour accéder ou utiliser la base de données, et assurez-vous que l'utilisateur dispose des autorisations appropriées ; 2. Vérifiez si le compte du service SQL Server est autorisé à accéder au fichier spécifié ou ; dossier et assurez-vous que le compte dispose des autorisations suffisantes pour lire et écrire le fichier ou le dossier ; 3. Vérifiez si le fichier de base de données spécifié a été ouvert ou verrouillé par d'autres processus, essayez de fermer ou de libérer le fichier et réexécutez la requête ; . Essayez en tant qu'administrateur, exécutez Management Studio en tant que etc.

Comment utiliser les instructions SQL pour l'agrégation de données et les statistiques dans MySQL ? L'agrégation des données et les statistiques sont des étapes très importantes lors de l'analyse des données et des statistiques. En tant que puissant système de gestion de bases de données relationnelles, MySQL fournit une multitude de fonctions d'agrégation et de statistiques, qui peuvent facilement effectuer des opérations d'agrégation de données et de statistiques. Cet article présentera la méthode d'utilisation des instructions SQL pour effectuer l'agrégation de données et les statistiques dans MySQL, et fournira des exemples de code spécifiques. 1. Utilisez la fonction COUNT pour compter. La fonction COUNT est la plus couramment utilisée.
