Der Inhalt dieses Artikels befasst sich mit dem Verständnis der Datenbanktransaktionsisolationsstufe und des nicht wiederholbaren Lesevorgangs. Ich hoffe, dass dies der Fall ist hilfreich für Sie.
1.1 ACID-Prinzip.
ACID-Prinzipien sind die vier Grundelemente für die normale Ausführung von Datenbanktransaktionen, die sich auf Atomizität, Konsistenz, Unabhängigkeit und Haltbarkeit beziehen.
Atomizität einer Transaktion (Atomizität) bedeutet, dass eine Transaktion entweder vollständig ausgeführt wird oder nicht. Das heißt, eine Transaktion kann nicht nur zur Hälfte ausgeführt und dann gestoppt werden. Wenn Sie Geld am Automaten abheben, kann diese Transaktion in zwei Schritte unterteilt werden: 1. Karte durchziehen, 2. Geld abheben. Es ist unmöglich, die Karte durchzuziehen, ohne dass das Geld ausgezahlt wird. Diese beiden Schritte müssen gleichzeitig ausgeführt werden. Andernfalls werden sie überhaupt nicht ausgeführt.
Transaktionskonsistenz (Konsistenz) bedeutet, dass der Vorgang der Transaktion die Konsistenz der Daten in der Datenbank nicht ändert. Beispielsweise gilt die Integritätsbeschränkung a + b = 10. Wenn eine Transaktion a ändert, sollte sich auch b entsprechend ändern. Mit anderen Worten: Wenn A 300 Yuan an B überweist, muss das Konto von A um 300 Yuan gekürzt und das Konto von B um 300 Yuan erhöht werden. Man kann nicht sagen, dass es sich um eine Erhöhung oder Verringerung handelt, z. B. um 200 Yuan usw Dies steht im Einklang mit der Transaktionsatomizität, entspricht jedoch nicht der Transaktionskonsistenz. Im tatsächlichen Geschäft ist es oft nicht so einfach, den Lagerbestand beim Kauf abzuziehen. Aufgrund von Konstruktionsfehlern befindet sich dann der Lagerbestand in der Lagerbestandstabelle , selbst wenn Transaktionen hinzugefügt werden, erscheint es immer noch. Zusätzlich zu den Problemen, dass der SKU-Bestand nicht mit dem Gesamtbestand übereinstimmt, bedeutet dies, dass die Konsistenz nicht erfüllt ist.
Unabhängigkeit(Isolation): Die Unabhängigkeit von Transaktionen wird auch als Isolation bezeichnet. Dies bedeutet, dass zwei oder mehr Transaktionen nicht in einem verschachtelten Zustand ausgeführt werden, da dies zu Dateninkonsistenzen führen kann. .
Durability(Durability): Sobald eine Transaktion festgeschrieben oder zurückgesetzt wird, muss dieser Zustand in der Datenbank beibehalten werden, unabhängig von Leseproblemen, die aufgrund der Isolation auftreten können.
1.2 Schmutziges Lesen, nicht wiederholbares Lesen und Phantomlesen.
Dirty Read(Dirty Read): Lesen von Daten in einer Transaktion, die nicht von einer anderen Transaktion festgeschrieben wurden. Wenn beispielsweise eine Transaktion auf Daten zugreift und Änderungen an den Daten vornimmt, die Änderungen jedoch noch nicht in die Datenbank übernommen wurden, greift eine andere Transaktion ebenfalls auf die Daten zu und verwendet sie dann.
Non-Repeatable Read(NonRepeatable Read): Keiner von beiden kann denselben Dateninhalt lesen. Dies bedeutet, dass dieselben Daten innerhalb einer Transaktion mehrmals gelesen werden, bevor die Transaktion endet, und dann zwischen den beiden Lesevorgängen von Daten in der ersten Transaktion aufgrund von Änderungen zwischen zwei Bei Transaktionen können die von der ersten Transaktion zweimal gelesenen Daten unterschiedlich sein.
Phantom Read(Phantom Read): In einer Transaktion sind die Ergebnisse der beiden Abfragen inkonsistent (für den Einfügevorgang). Es bezieht sich auf ein Phänomen, das auftritt, wenn Transaktionen nicht unabhängig voneinander ausgeführt werden. Beispielsweise ändert die erste Transaktion die Daten in einer Tabelle und diese Änderung betrifft alle Datenzeilen in der Tabelle. Gleichzeitig werden durch die zweite Transaktion auch die Daten in dieser Tabelle geändert. Durch diese Änderung wird eine Zeile mit neuen Daten in die Tabelle eingefügt. Wenn dann der Benutzer, der die erste Transaktion ausführt, feststellt, dass die Tabelle noch unveränderte Datenzeilen enthält, kommt es einer Illusion gleich.
Beispielsweise ändert ein Redakteur ein von einem Autor eingereichtes Dokument, aber wenn die Produktion seine Änderungen in die Masterkopie des Dokuments einfügt, wird festgestellt, dass der Autor dem Dokument neues, unbearbeitetes Material hinzugefügt hat. Dieses Problem kann vermieden werden, wenn niemand neues Material zum Dokument hinzufügen kann, bis die Redaktion und die Produktionsabteilung die Arbeit am Originaldokument abgeschlossen haben.
Es gibt 4 Isolationsstufen für Datenbanktransaktionen, von niedrig bis hoch: Nicht festgeschrieben lesen (nicht festgeschrieben lesen), Festgeschrieben lesen (festgeschrieben lesen), Wiederholbares Lesen (wiederholbares Lesen), Serialisierbar (Serialisierung). Diese vier Ebenen können die Probleme von Dirty Read, nicht wiederholbarem Lesen und Phantomlesen nacheinander lösen.
2.1 Unverbindlich lesen
Das Unternehmen zahlte Löhne und der Leiter überwies 5.000 Yuan auf Singos Konto, aber die Transaktion wurde nicht übermittelt und Singo überprüfte zufällig sein Konto und stellte fest, dass sein Gehalt 5.000 Yuan betrug, was ihn sehr glücklich machte. Leider stellte der Leiter fest, dass das an Singo gezahlte Gehalt 2.000 Yuan betragen sollte, also machte er die Transaktion schnell rückgängig (Rollback von 5.000 Yuan), änderte den Betrag (auf 2.000 Yuan) und reichte die Transaktion schließlich ein kostet nur 2.000 Yuan und Singo ist glücklich.
Die obige Situation tritt auf, was wir Dirty Reading nennen, zwei gleichzeitige Transaktionen: „Transaktion A: Der Leiter zahlt das Gehalt an Singo“, „Transaktion B: Singo fragt das Gehaltskonto ab“, Transaktion B liest Transaktion A hat noch keine Daten festgeschrieben.
Wenn die Isolationsstufe auf „Lesen nicht festgeschrieben“ (Lesen nicht festgeschrieben) eingestellt ist, können schmutzige Lesevorgänge auftreten. Wenn wir zu diesem Zeitpunkt die Isolationsstufe auf „Lesen festgeschrieben“ (Lesen festgeschrieben) erhöhen, können schmutzige Lesevorgänge vermieden werden.
2.2 Lesen Sie engagiert
Singo nahm die Gehaltskarte, um einen Kauf zu tätigen, und das System stellte fest, dass sich tatsächlich 2.000 Yuan auf der Karte befanden. Zu diesem Zeitpunkt überwies ihre Frau zufällig Geld online und überwies die 2.000 Yuan von der Singo-Gehaltskarte Auf ein anderes Konto und in Singo habe ich zuvor eine Transaktion eingereicht, aber als Singo das Geld abbuchte, überprüfte das System, dass sich kein Geld auf Singos Gehaltskarte befand, und die Abbuchung schlug offensichtlich fehl. Es war offensichtlich, dass Geld auf der Karte war , aber was ist passiert?
Die obige Situation tritt auf, das heißt, was wir als nicht wiederholbares Lesen bezeichnen, zwei gleichzeitige Transaktionen: „Transaktion A: Singo-Verbrauch“, „Transaktion B: Singos Frau Online-Übertragung“, Transaktion A hat im Voraus gelesen Daten, Transaktion B hat die Daten sofort aktualisiert und die Transaktion festgeschrieben, und als Transaktion A die Daten erneut las, hatten sich die Daten geändert.
Wenn die Isolationsstufe auf „Lesen festgeschrieben“ eingestellt ist, werden Dirty Reads vermieden, es kann jedoch zu nicht wiederholbaren Lesevorgängen (derselbe Dateninhalt kann nicht gelesen werden) kommen.
Die Standardstufe der meisten Datenbanken ist Read commited, z. B. SQL Server und Oracle. Wenn Sie zu diesem Zeitpunkt die Isolationsstufe auf Wiederholbares Lesen aktualisieren, können Sie fehlerhafte Lesevorgänge und nicht wiederholbare Lesevorgänge vermeiden .
2.3 Wiederholbares Lesen
Wenn die Isolationsstufe auf Wiederholbares Lesen eingestellt ist, können nicht wiederholbare Lesevorgänge vermieden werden. Wenn Singo die Gehaltskarte zum Konsumieren nimmt und das System mit dem Lesen der Gehaltskarteninformationen beginnt (d. h. die Transaktion beginnt), kann Singos Frau den Datensatz nicht mehr ändern, d. h. Singos Frau kann zu diesem Zeitpunkt kein Geld überweisen.
(Die von den beiden Blogs hier angegebenen Beispiele sind unterschiedlich, bitte geben Sie den Grund an) Mit anderen Worten, es gibt zwei Sitzungen A und B, und dann werden jeweils zwei Transaktionen eröffnet A sendet eine Nachricht an B mit der Überweisung von 500 Yuan, A übermittelt die Transaktion und B überprüft erneut und stellt fest, dass es sich immer noch um den ursprünglichen Betrag handelt -wiederholbare Lesungen. Wenn wir Seriizable (Serialisierung) festlegen, entspricht dies dem Sperren der Tabelle, und nur eine Transaktion darf zu einem bestimmten Zeitpunkt auf die Tabelle zugreifen.
Obwohl durch wiederholbare Lesevorgänge nicht wiederholbare Lesevorgänge vermieden werden, kann es dennoch zu Phantom-Lesevorgängen kommen.
Singos Frau arbeitet beispielsweise in der Bankabteilung. Sie überprüft häufig Singos Kreditkartenverbrauchsaufzeichnungen über das interne System der Bank. Eines Tages überprüfte sie, dass der Gesamtverbrauch von Singos Kreditkarte in diesem Monat (wählen Sie den Betrag (Betrag) aus der Transaktion, wobei Monat = dieser Monat) 80 Yuan betrug. Zu diesem Zeitpunkt aß Singo gerade draußen und bezahlte dann die Rechnung an der Kasse. 1.000 Yuan, das heißt, ein neuer Verbrauchsdatensatz von 1.000 Yuan (Transaktion einfügen...) wurde hinzugefügt und die Transaktion wurde auf A4-Papier gedruckt. stellte jedoch fest, dass der Gesamtverbrauch 1.080 Yuan betrug. Meine Frau war sehr überrascht, weil sie dachte, sie hätte Halluzinationen, und so kam es zu der Phantomlesung.
Hinweis: Die Standardisolationsstufe von MySQL ist Wiederholbares Lesen.
2.4 Serialisierbar (Serialisierung)
Serialisierbar (Serialisierung) ist die höchste Transaktionsisolationsstufe, aber auch die teuerste und weist im Allgemeinen eine sehr geringe Leistung auf Selten verwendet, werden Transaktionen auf dieser Ebene sequentiell ausgeführt, wodurch nicht nur schmutzige Lesevorgänge und nicht wiederholbare Lesevorgänge, sondern auch Phantom-Lesevorgänge vermieden werden.
3.1 Isolationsstufe und entsprechende Tabelle möglicher Probleme
隔离级别 | 脏读(Dirty read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交 (Read uncommitted) |
可能 | 可能 | 可能 |
读已提交 (Read committed) |
不可能 | 可能 | 可能 |
可重复读 (Repeatable read) |
不可能 | 不可能 | 可能 |
序列化 (Serializable) |
不可能 | 不可能 | 不可能 |
Das obige ist der detaillierte Inhalt vonSo verstehen Sie die Isolationsstufen von Datenbanktransaktionen sowie Dirty Reads, nicht wiederholbare Lesevorgänge und Phantom Reads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!