- Dirty Reads: Lesen Sie UNCOMMITED-Daten aus einer anderen Transaktion
- Nicht wiederholbare Lesevorgänge : Lesen Sie COMMITTED-Daten aus einer
UPDATE
Abfrage einer anderen Transaktion
- Phantom liest : Lesen Sie COMMITTED-Daten aus einer
INSERT
oder eineDELETE
Abfrage aus einer anderen Transaktion
Hinweis : DELETE-Anweisungen aus einer anderen Transaktion haben in bestimmten Fällen auch eine sehr geringe Wahrscheinlichkeit, nicht wiederholbare Lesevorgänge zu verursachen. Es passiert, wenn die DELETE-Anweisung leider dieselbe Zeile entfernt, die Ihre aktuelle Transaktion abgefragt hat. Dies ist jedoch ein seltener Fall und in einer Datenbank mit Millionen von Zeilen in jeder Tabelle weitaus unwahrscheinlicher. Tabellen mit Transaktionsdaten weisen normalerweise in jeder Produktionsumgebung ein hohes Datenvolumen auf.
Wir können auch beobachten, dass UPDATES in den meisten Anwendungsfällen häufiger auftreten als das tatsächliche INSERT oder DELETES (in solchen Fällen besteht nur die Gefahr nicht wiederholbarer Lesevorgänge - Phantom-Lesevorgänge sind in diesen Fällen nicht möglich). Aus diesem Grund werden UPDATES anders behandelt als INSERT-DELETE, und die resultierende Anomalie wird auch anders benannt.
Mit der Verarbeitung von INSERT-DELETEs sind zusätzliche Verarbeitungskosten verbunden, anstatt nur die UPDATES zu verarbeiten.
- READ_UNCOMMITTED verhindert nichts. Es ist die Isolationsstufe Null
- READ_COMMITTED verhindert nur einen, dh schmutzige Lesevorgänge
- REPEATABLE_READ verhindert zwei Anomalien: fehlerhafte Lesevorgänge und nicht wiederholbare Lesevorgänge
- SERIALIZABLE verhindert alle drei Anomalien: Dirty Reads, Non-Repeatable Reads und Phantom Reads
Warum setzen Sie dann nicht einfach die Transaktion SERIALIZABLE jederzeit? Nun, die Antwort auf die obige Frage lautet: Die Einstellung SERIALIZABLE macht Transaktionen sehr langsam , was wir wiederum nicht wollen.
Tatsächlich beträgt der Transaktionszeitverbrauch die folgende Rate:
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
Die Einstellung READ_UNCOMMITTED ist also die schnellste .
Zusammenfassung
Tatsächlich müssen wir den Anwendungsfall analysieren und eine Isolationsstufe festlegen , um die Transaktionszeit zu optimieren und die meisten Anomalien zu vermeiden.
Beachten Sie, dass Datenbanken standardmäßig die Einstellung REPEATABLE_READ haben.