Maison  >  Article  >  base de données  >  Explication détaillée MySQL hautes performances des transactions et des niveaux d'isolement

Explication détaillée MySQL hautes performances des transactions et des niveaux d'isolement

黄舟
黄舟original
2017-03-15 17:19:061264parcourir


Cet article comprend principalement le contenu suivant :
(1) La notion de transactions et d'ACID
(2) Niveau d'isolement des transactions
(3) Transactions dans MySQL

1. Transactions et ACID

La compréhension des transactions est la base d'autres concepts avancés.

Transaction : une transaction est un ensemble de requêtes SQL atomiques , ou une unité d'exécution indépendante. Soit toutes réussissent, soit toutes échouent. Si elle échoue, renvoyez Roll au précédent <.>état de la transaction.

Comprenons les concepts d'ACID dans la base de données : atomicité, cohérence, isolation et durabilité.

(1) Atomicité : Les opérations d'une transaction constituent une unité globale indivisible, soit toutes sont effectuées, soit aucune n'est effectuée.

(2) Cohérence : la base de données doit être dans un état cohérent avant et après l'exécution de la transaction.

(3) Isolement : De manière générale, les modifications apportées par une transaction ne sont pas visibles par les autres transactions avant la soumission finale. Cela implique la question du niveau d’isolement des transactions.

(4) Durabilité : Une fois la transaction soumise, la modification est permanente et ne sera pas affectée même si le serveur est en panne.

Afin de mieux comprendre ACID, prenons comme exemple un virement bancaire :

-- 开始事务START TRANSACTION;
-- 查询支票账户余额+
SELECT balance FROM checking WHERE customer_id = 10233276;+
-- 将支票账户减去200UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
-- 将余额账户增加200UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
-- 提交事务更新COMMIT;
Atomicité : Soit s'engager pleinement (le solde courant de 10233276 est réduit de 200, et le le solde de l'épargne est augmenté de 200), ou annulé complètement (les soldes des deux tables ne changeront pas)

Cohérence : La cohérence de cet exemple se reflète dans le fait que 200 yuans ne changeront pas car le système de base de données passe à la 3ème ligne et à la 4ème ligne. La ligne précédente s'est écrasée et a disparu car la chose n'était pas encore validée.

Isolement : les relevés d'opération d'une transaction peuvent être isolés des relevés d'autres transactions. Par exemple, la transaction A s'exécute après la ligne 3 et avant la ligne 4, et la transaction B interroge le solde de contrôle à ce moment-là. , il peut toujours voir les 200 yuans qui ont été soustraits dans la transaction A (l'argent du compte reste inchangé), car les transactions A et B sont isolées l'une de l'autre. Avant la validation de la transaction A, la transaction B ne peut pas observer les modifications des données.

Persistance : Ceci est facile à comprendre, c'est-à-dire que la modification est permanente une fois la transaction soumise.

Les transactions, comme les verrous, nécessitent beaucoup de travail, vous pouvez donc décider si vous avez besoin d'une prise en charge des transactions et choisir différents moteurs de stockage en fonction de vos propres besoins.

2. Niveau d'isolement des transactions

SQL définit quatre niveaux d'isolement pour limiter les données visibles dans une transaction. Il est évident que les niveaux d’isolement de bas niveau entraînent une concurrence plus élevée et une charge système moindre, mais ils entraînent également des problèmes de sécurité des données.

Lecture non validée (lecture non validée)

À ce niveau d'isolement, toutes les transactions peuvent voir les résultats d'exécution d'autres transactions non validées. La lecture de données non validées est également appelée lecture sale. Ce niveau est rarement utilisé.

Lecture validée

Il s'agit du niveau d'isolement par défaut pour la plupart des systèmes de bases de données (mais pas celui par défaut de MySQL). Cela répond à la définition simple de l'isolement : une transaction ne peut voir que les modifications apportées par les transactions validées. En d'autres termes, elle est invisible pour les autres transactions avant qu'elle ne soit validée. Ce niveau d'isolement prend également en charge la lecture non répétable, car d'autres instances de la même transaction peuvent avoir de nouvelles validations pendant le traitement de cette instance, de sorte que la même requête de sélection peut renvoyer des résultats différents.

Lecture répétable (lecture répétable)

Il s'agit du niveau d'isolation des transactions par défaut de MySQL Il garantit que plusieurs instances de la même transaction peuvent. exécuter simultanément Lors de la lecture des données, vous verrez les mêmes lignes de données. Cependant, en théorie, cela entraînera un autre problème épineux : la lecture fantôme (Phantom Read). En termes simples, la lecture fantôme signifie que lorsque l'utilisateur lit une certaine plage de lignes de données, une autre transaction insère une nouvelle ligne dans la plage. Lorsque l'utilisateur lit à nouveau les lignes de données de la plage, il constatera qu'il y a de nouveaux " Fantôme ». D'ACCORD. Les moteurs de stockage InnoDB et Falcon résolvent ce problème grâce au mécanisme de contrôle de concurrence multiversion (MVCC, Multiversion Concurrency Control).

Sérialisable

Il s'agit du niveau d'isolement le plus élevé. Il force les transactions à être exécutées en série, ce qui rend impossible leur conflit les unes avec les autres. . En d’autres termes, il ajoute un verrou partagé sur chaque ligne de données lue. À ce niveau, de nombreux délais d'attente et conflits de verrouillage peuvent en résulter.

Les problèmes qui peuvent survenir lors de la mise en œuvre de ces quatre secteurs d'isolation dans MySQL sont les suivants :


Explication détaillée MySQL hautes performances des transactions et des niveaux disolement

3. Transactions dans MySQL

La valeur par défaut dans MySQL est d'adopter le mode de validation automatique (AutoCommit), ce qui signifie que tant qu'une transaction n'est pas explicitement démarrée, chaque opération de requête est traitée comme une transaction pour effectuer une opération de validation.

Nous pouvons activer ou désactiver le mode de validation automatique en définissant la variable AUTOCOMMIT .
Le réglage 1 signifie activer AUTOCOMMIT, 0 signifie désactiver AUTOCOMMIT.


Cet article comprend principalement le contenu suivant :
(1) La notion de transactions et d'ACID
(2) Niveau d'isolement des transactions
(3) Transactions dans 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