Maison > Article > base de données > Comment comprendre les niveaux d'isolement des transactions de base de données et les lectures incorrectes, les lectures non répétables et les lectures fantômes
Le contenu de cet article explique comment comprendre le niveau d'isolement des transactions de la base de données et les lectures sales, les lectures non répétables et les lectures fantômes. J'espère que ce sera le cas. utile pour vous aider.
1.1 Principe ACID.
Les principes ACID sont les quatre éléments de base pour l'exécution normale des transactions de base de données, qui font référence à l'atomicité, à la cohérence, à l'indépendance et à la durabilité.
Atomicité d'une transaction (Atomicité) signifie qu'une transaction est entièrement exécutée ou non exécutée C'est-à-dire qu'une transaction ne peut pas être exécutée seulement à moitié puis s'arrêter. si vous retirez de l'argent de Pour retirer de l'argent de la machine, cette transaction peut être divisée en deux étapes : 1. glisser la carte, 2. retirer de l'argent. Il est impossible de glisser la carte sans que l'argent ne sorte. Ces deux étapes doivent être complétées en même temps, sinon elles ne sont pas complétées du tout.
Cohérence des transactions (Cohérence) signifie que le fonctionnement de la transaction ne modifie pas la cohérence des données dans la base de données. Par exemple, la contrainte d'intégrité a+b=10, si une transaction modifie a, alors b devrait également changer en conséquence. En d'autres termes, si A transfère 300 yuans à B, alors le compte de A doit être réduit de 300 yuans et le compte de B doit être augmenté de 300 yuans. On ne peut pas dire qu'il s'agit d'une augmentation ou d'une diminution, comme 200 yuans, etc. . Ceci est cohérent avec l'atomicité de la transaction, mais incompatible avec la cohérence de la transaction. Dans les affaires réelles, ce n'est pas si simple. Il s'agit souvent d'une logique similaire à la déduction des stocks lors de l'achat de quelque chose. Il y a des stocks dans la table principale, des stocks dans la table des stocks et des stocks dans la table SKU. , même si des transactions sont ajoutées, cela apparaît toujours. En plus des problèmes de survente et de stock de SKU ne correspondant pas à l'inventaire total, cela signifie que la cohérence n'est pas satisfaite.
Indépendance(Isolement) : L'indépendance des transactions est également appelée isolement. Cela signifie que deux ou plusieurs transactions ne seront pas exécutées dans un état entrelacé, car cela peut conduire à une incohérence des données. .
Durabilité(Durabilité) : Une fois qu'une transaction est validée ou annulée, cet état doit être conservé dans la base de données, quels que soient les problèmes de lecture pouvant survenir en raison de l'isolement.
1.2 Lecture sale, lecture non répétable et lecture fantôme.
Lecture sale(Lecture sale) : Lecture de données dans une transaction qui n'ont pas été validées par une autre transaction. Par exemple, lorsqu'une transaction accède à des données et y apporte des modifications, mais que les modifications n'ont pas encore été validées dans la base de données, une autre transaction accède également aux données et utilise ensuite les données.
Lecture non répétable(Lecture non répétable) : aucun des deux ne peut lire le même contenu de données. Cela signifie que les mêmes données sont lues plusieurs fois au sein d'une transaction. Avant la fin de la transaction, une autre transaction accède également aux mêmes données et les modifie ensuite, entre les deux lectures de données de la première transaction, en raison des modifications effectuées entre deux. transactions, les données lues deux fois par la première transaction peuvent être différentes.
Phantom Read(Phantom Read) : Dans une transaction, les résultats des deux requêtes sont incohérents (pour l'opération d'insertion). Il s'agit d'un phénomène qui se produit lorsque les transactions ne sont pas exécutées indépendamment. Par exemple, la première transaction modifie les données d'une table, et cette modification concerne toutes les lignes de données de la table. Parallèlement, la deuxième transaction modifie également les données de cette table. Cette modification insère une ligne de nouvelles données dans la table. Ensuite, si l'utilisateur qui effectue la première transaction constate qu'il y a encore des lignes de données non modifiées dans le tableau, ce sera comme une illusion.
Par exemple, un éditeur modifie un document soumis par un auteur, mais lorsque la production fusionne ses modifications dans la copie principale du document, on découvre que l'auteur a ajouté du nouveau matériel non édité au document. Ce problème peut être évité si personne ne peut ajouter de nouveaux éléments au document tant que les éditeurs et le service de production n'ont pas fini de travailler sur le document original.
Il existe 4 niveaux d'isolement pour les transactions de base de données, de bas en haut, ils sont Lecture non validée (lecture non validée), Lecture validée (lecture validée), Lecture répétable (lecture répétable), sérialisable (sérialisation), ces quatre niveaux peuvent résoudre un à un les problèmes de lecture sale, de lecture non répétable et de lecture fantôme.
2.1 Lecture non engagée
L'entreprise a payé les salaires et le dirigeant a transféré 5 000 yuans sur le compte de Singo, mais la transaction n'a pas été soumise et Singo a vérifié son compte et a découvert que son salaire était de 5 000 yuans, ce qui l'a rendu très heureux. Malheureusement, le dirigeant a découvert que le salaire versé à Singo devait être de 2 000 yuans, il a donc rapidement annulé la transaction (annulation de 5 000 yuans), modifié le montant (à 2 000 yuans) et a finalement soumis la transaction. ne coûte que 2 000 yuans, et Singo est content.
La situation ci-dessus se produit, ce que nous appelons une lecture sale, deux transactions simultanées, "Transaction A : le leader paie le salaire à singo", "Transaction B : singo interroge le compte de salaire", la transaction B lit Transaction A n'a pas encore validé de données.
Lorsque le niveau d'isolement est défini sur Lecture non validée (lecture non validée), des lectures sales peuvent se produire. Si nous augmentons le niveau d'isolement sur Lecture validée (lecture validée) à ce moment, les lectures sales peuvent être évitées.
2.2 Lecture engagée
Singo a pris la carte de salaire pour effectuer un achat, et le système a lu qu'il y avait effectivement 2 000 yuans sur la carte. À ce moment-là, sa femme était en train de transférer de l'argent en ligne et a transféré les 2 000 yuans de la carte de salaire Singo. sur un autre compte, et dans singo, j'ai déjà soumis une transaction, mais lorsque Singo a déduit l'argent, le système a vérifié qu'il n'y avait pas d'argent sur la carte de salaire de Singo, et la déduction a échoué. Il y avait évidemment de l'argent dans la carte. , mais que s'est-il passé ?
La situation ci-dessus se produit, c'est-à-dire ce que nous appelons une lecture non répétable, deux transactions simultanées, "Transaction A : consommation de singo", "Transaction B : transfert en ligne de la femme de singo", la transaction A a été lue à l'avance Données, la transaction B a immédiatement mis à jour les données et validé la transaction, et lorsque la transaction A a relu les données, les données avaient changé.
Lorsque le niveau d'isolement est défini sur Lecture validée, les lectures sales sont évitées, mais des lectures non répétables (le même contenu de données ne peut pas être lu) peuvent se produire.
Le niveau par défaut de la plupart des bases de données est Lecture validée, comme Sql Server et Oracle. À l'heure actuelle, si vous mettez à niveau le niveau d'isolement en lecture répétable, vous pouvez éviter les lectures sales et les lectures non répétables. .
2.3 Lecture répétable
Lorsque le niveau d'isolement est défini sur Lecture répétable, les lectures non répétables peuvent être évitées. Lorsque Singo prend la carte de salaire pour consommer, une fois que le système commence à lire les informations de la carte de salaire (c'est-à-dire que la transaction démarre), la femme de Singo ne peut pas modifier l'enregistrement, c'est-à-dire que la femme de Singo ne peut pas transférer d'argent pour le moment.
(Les exemples donnés par les deux blogs ici sont différents, merci d'indiquer la raison) En d'autres termes, il y a deux sessions A et B, et deux transactions sont ouvertes respectivement, et puis A envoie un message à B pour transférer 500 yuans, A a soumis la transaction et B a vérifié à nouveau et a constaté qu'il s'agissait toujours du montant initial. B ne peut que terminer la transaction en cours et démarrer une nouvelle transaction pour interroger les modifications de données, évitant ainsi les non-conformités. -lectures répétables. Si nous définissons Seriizing (sérialisation), cela équivaut à verrouiller la table, et une seule transaction est autorisée à accéder à la table à un certain moment.
Bien que la lecture répétable évite les lectures non répétables, des lectures fantômes peuvent toujours se produire.
Par exemple, l'épouse de Singo travaille dans le service bancaire. Elle vérifie souvent les relevés de consommation des cartes de crédit de Singo via le système interne de la banque. Un jour, elle vérifiait que le montant total de la consommation de la carte de crédit de Singo ce mois-là (sélectionnez la somme (montant) de la transaction où mois = ce mois-ci) était de 80 yuans. À ce moment-là, Singo mangeait dehors et payait ensuite la facture. à la caisse, 1 000 yuans, c'est-à-dire un nouveau record de consommation de 1 000 yuans (insérer la transaction...) a été ajouté et la transaction a été soumise. Ensuite, la femme de Singo a imprimé les détails de la consommation de la carte de crédit de Singo pour le mois sur du papier A4, mais j'ai découvert que la consommation totale était de 1 080 yuans. Ma femme a été très surprise et a pensé qu'elle avait des hallucinations, alors la lecture fantôme s'est produite.
Remarque : Le niveau d'isolement par défaut de Mysql est Lecture répétable.
2.4 Sérialisable (sérialisation)
Sérialisable (sérialisation) est le niveau d'isolation des transactions le plus élevé, et c'est aussi le plus cher et ses performances sont généralement très faibles. rarement utilisé. , à ce niveau, les transactions sont exécutées séquentiellement, ce qui évite non seulement les lectures sales, les lectures non répétables, mais évite également les lectures fantômes.
3.1 Niveau d'isolement et tableau correspondant des problèmes possibles
隔离级别 | 脏读(Dirty read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交 (Read uncommitted) |
可能 | 可能 | 可能 |
读已提交 (Read committed) |
不可能 | 可能 | 可能 |
可重复读 (Repeatable read) |
不可能 | 不可能 | 可能 |
序列化 (Serializable) |
不可能 | 不可能 | 不可能 |
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!