Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Aurora Meine SQL Isolationsstufen
Erfahren Sie, wie DB-Instances in einem Aurora SQL My-Cluster die Datenbankeigenschaft der Isolation implementieren. In diesem Thema wird erklärt, wie das SQL Standardverhalten von Aurora My ein Gleichgewicht zwischen strikter Konsistenz und hoher Leistung herstellt. Mithilfe dieser Informationen können Sie entscheiden, wann je nach den Eigenschaften Ihres Workloads die Standardeinstellungen geändert werden sollten.
Verfügbare Isolierungsstufen für Writer-Instances
Sie können die IsolationsstufenREPEATABLE READ
, READ COMMITTED
READ UNCOMMITTED
, und SERIALIZABLE
auf der primären Instance eines Aurora My SQL DB-Clusters verwenden. Diese Isolationsstufen funktionieren in Aurora My SQL genauso wie in RDS MySQL.
REPEATABLEREADIsolationsstufe für Leser-Instanzen
Standardmäßig verwenden Aurora My SQL DB-Instances, die als schreibgeschützte Aurora Replicas konfiguriert sind, immer die REPEATABLE
READ
Isolationsstufe. Diese DB-Instances ignorieren alle SET TRANSACTION ISOLATION LEVEL
-Anweisungen und verwenden weiterhin die Isolierungsstufe REPEATABLE READ
.
Sie können die Isolationsstufe für Reader-DB-Instances nicht mithilfe von DB-Parametern oder DB-Cluster-Parametern festlegen.
READCOMMITTEDIsolationsstufe für Reader-Instances
Wenn Ihre Anwendung schreibintensive Workloads auf der primären Instance und lang andauernde Abfragen auf den Aurora-Replicas beinhaltet, kann es zu erheblichen Bereinigungsverzögerungen kommen. Eine Bereinigungsverzögerung tritt auf, wenn die interne Garbage Collection von lang andauernden Abfragen blockiert wird. Das Symptom, das Sie sehen, ist ein hoher Wert für history list length
in der Ausgabe des SHOW ENGINE INNODB STATUS
-Befehls. Sie können diesen Wert mithilfe der RollbackSegmentHistoryListLength
Metrik in überwachen CloudWatch. Eine erhebliche Bereinigungsverzögerung kann die Effektivität sekundärer Indizes reduzieren und zu einer geringeren allgemeinen Abfrageleistung führen sowie Speicherplatz verschwenden.
Wenn Sie auf solche Probleme stoßen, können Sie die Konfigurationseinstellung Aurora My auf SQL Sitzungsebene festlegenaurora_read_replica_read_committed
, um die READ COMMITTED
Isolationsstufe auf Aurora Replicas zu verwenden. Die Verwendung dieser Einstellung kann Verlangsamungen sowie die Verschwendung von Speicherplatz durch lang andauernde Abfragen reduzieren, während Transaktionen Ihre Tabellen modifizieren.
Wir empfehlen Ihnen, sich mit dem spezifischen SQL Verhalten der READ COMMITTED
Isolierung in Aurora My vertraut zu machen, bevor Sie diese Einstellung verwenden. Das READ COMMITTED
Verhalten von Aurora Replica entspricht dem ANSI SQL Standard. Die Isolierung ist jedoch weniger streng als das typische SQL READ COMMITTED
Verhalten von My, mit dem Sie vielleicht vertraut sind. Daher sehen Sie READ COMMITTED
unter einer Aurora My SQL Read Replica möglicherweise andere Abfrageergebnisse als für dieselbe Abfrage READ COMMITTED
unter der Aurora My SQL Primary Instance oder unter RDS MySQL. Sie können die aurora_read_replica_read_committed
-Einstellung für Anwendungsfälle wie einen umfassenden Bericht über eine sehr große Datenbank verwenden. Für kurze Abfragen mit kleinen Ergebnissätzen, bei denen es auf Präzision und Wiederholbarkeit ankommt, sollten Sie sie eher nicht verwenden.
Die READ COMMITTED
-Isolierungsstufe ist nicht für Sitzungen innerhalb eines sekundären Clusters in einer globalen Aurora-Datenbank verfügbar, die die Schreibweiterleitungsfunktion verwenden. Informationen zur Schreibweiterleitung finden Sie unter Verwenden der Schreibweiterleitung in einer Amazon Aurora globalen Datenbank.
READCOMMITTEDFür Leser verwenden
Um die Isolierungsstufe READ COMMITTED
für Aurora-Replicas zu aktivieren, setzen Sie die Konfigurationseinstellung aurora_read_replica_read_committed
auf ON
. Verwenden Sie diese Einstellung auf Sitzungsebene bei Verbindung zu einer spezifischen Aurora-Replica. Führen Sie dazu die folgenden SQL Befehle aus.
set session aurora_read_replica_read_committed = ON; set session transaction isolation level read committed;
Sie können diese Konfigurationseinstellung temporär verwenden, um interaktive einmalige Abfragen durchzuführen. Sie können auch eine Berichts- oder Datenanalyseanwendung ausführen, die von der Isolierungsstufe READ COMMITTED
profitiert, wobei die Standards für andere Anwendungen unverändert bleiben.
Wenn die aurora_read_replica_read_committed
-Einstellung aktiviert ist, geben Sie mit dem SET TRANSACTION ISOLATION
LEVEL
-Befehl die Isolierungsstufe für die jeweiligen Transaktionen an.
set transaction isolation level read committed;
READCOMMITTEDVerhaltensunterschiede auf Aurora-Repliken
Die aurora_read_replica_read_committed
-Einstellung stellt die Isolierungsstufe READ COMMITTED
für eine Aurora-Replica zur Verfügung, mit einem Konsistenzverhalten, das für lang andauernde Transaktionen optimiert ist. Die Isolierungsstufe READ
COMMITTED
auf Aurora-Replicas bietet eine weniger strikte Isolierung als auf primären Aurora-Instances. Aktivieren Sie daher diese Einstellung nur auf Aurora-Replicas, wenn Sie wissen, dass für Ihre Abfragen bestimmte Arten inkonsistenter Ergebnisse akzeptabel sind.
Bei Ihren Abfragen können bestimmte Arten von Anomalien auftreten, wenn die aurora_read_replica_read_committed
-Einstellung aktiviert ist. Dabei sollten Sie besonders zwei Arten von Anomalien verstehen und in Ihrem Anwendungscode berücksichtigen. Eine nicht-wiederholbarer Lesevorgang tritt auf, wenn eine andere Transaktion ein Commit durchführt, während Ihre Abfrage läuft. Eine lang andauernde Abfrage kann an ihrem Anfang andere Daten sehen als an ihrem Ende. Eine Phantom-Lesevorgang tritt auf, wenn andere Transaktionen dazu führen, dass bestehende Zeilen umorganisiert werden, während Ihre Abfrage läuft, und dass dadurch eine oder mehrere Zeilen von Ihrer Abfrage zweimal gelesen werden.
Phantom-Lesevorgänge können in Ihren Abfragen zu inkonsistenten Zeilenanzahlen führen. Nicht-wiederholbare Lesevorgänge können auch zur Ausgabe unvollständiger oder inkonsistenter Ergebnisse führen. Nehmen wir beispielsweise an, dass sich ein Join-Vorgang auf Tabellen bezieht, die gleichzeitig durch SQL Anweisungen wie INSERT
oder geändert werden. DELETE
In diesem Fall kann es sein, dass die Join-Abfrage eine Zeile aus einer Tabelle liest, aber nicht die entsprechende Zeile aus einer anderen Tabelle.
Der ANSI SQL Standard erlaubt beide Verhaltensweisen für die READ COMMITTED
Isolationsstufe. Diese Verhaltensweisen unterscheiden sich jedoch von der typischen SQL My-Implementierung vonREAD COMMITTED
. Bevor Sie die aurora_read_replica_read_committed
Einstellung aktivieren, überprüfen Sie daher den vorhandenen SQL Code, um zu überprüfen, ob er nach dem Modell mit geringerer Konsistenz erwartungsgemäß funktioniert.
Zeilenanzahlen und andere Ergebnisse sind auf der Isolationsstufe READ COMMITTED
bei Aktivierung dieser Einstellung möglicherweise nicht streng konsistent. Sie sollten diese Einstellung daher typischerweise nur aktivieren, wenn Sie analytische Abfragen ausführen, die große Datenmengen aggregieren und für die keine absolute Präzision erforderlich ist. Wenn Sie nicht solche lang andauernden Abfragen zusammen mit schreibintensiven Workloads verwenden, benötigen Sie die aurora_read_replica_read_committed
-Einstellung wahrscheinlich nicht. Ohne die Kombination aus lang andauernden Abfragen und schreibintensiven Workloads sind Probleme mit der Länge der Verlaufsliste unwahrscheinlich.
Beispiel Abfragen, die das Isolationsverhalten für READ COMMITTED auf Aurora Replicas zeigen
Das folgende Beispiel zeigt, wie READ COMMITTED
-Abfragen auf einer Aurora-Replica möglicherweise nicht wiederholbare Ergebnisse ausgeben, wenn Transaktionen gleichzeitig die zugehörigen Tabellen modifizieren. Die Tabelle BIG_TABLE
enthält eine Million Zeilen vor Beginn jeder Anfrage. Andere Data Manipulation Language (DML) -Anweisungen fügen Zeilen hinzu, entfernen oder ändern sie, während sie ausgeführt werden.
Die Abfragen auf der primären Aurora-Instance bei Isolierungsstufe READ COMMITTED
führen zu vorhersehbaren Ergebnissen. Die Overheadlast, die damit verbunden ist, den Consistent-Lesevorgang für die gesamte Dauer einer lang andauernden Abfrage aufrechtzuerhalten, kann später zum umfangreichen Garbage Collection führen.
Die Abfragen auf der Aurora-Replica bei Isolierungsstufe READ COMMITTED
sind so optimiert, dass dieses Garbage-Collection-Overhead minimiert wird. Dies führt aber andererseits dazu, dass die Ergebnisse abweichen können, wenn die Abfragen auf Zeilen stoßen, die von Transaktionen, die während der Ausführung der Abfrage Commits durchführen, hinzugefügt, entfernt oder umorganisiert werden. Die Abfragen können diese Zeilen berücksichtigen, müssen dies aber nicht tun. Zu Demonstrationszwecken prüfen die Abfragen nur die Anzahl der Zeilen in der Tabelle mithilfe der COUNT(*)
-Funktion.
Zeit | DMLAussage zur Aurora-Primärinstanz | Abfrage der primären Aurora-Instance mit READ COMMITTED | Anfrage zu Aurora Replica mit READ COMMITTED |
---|---|---|---|
T1 |
INSERT INTO big_table SELECT * FROM other_table LIMIT 1000000; COMMIT;
|
||
T2 | Q1: SELECT COUNT(*) FROM big_table; |
Q2: SELECT COUNT(*) FROM big_table; |
|
T3 |
INSERT INTO big_table (c1, c2) VALUES (1, 'one more row'); COMMIT;
|
||
T4 | Wenn Q1 jetzt beendet wird, ist das Ergebnis 1.000.000. | Wenn Q2 jetzt beendet wird, ist das Ergebnis 1.000.000 oder 1.000.001. | |
T5 |
DELETE FROM big_table LIMIT 2; COMMIT;
|
||
T6 | Wenn Q1 jetzt beendet wird, ist das Ergebnis 1.000.000. | Wenn Q2 jetzt beendet wird, ist das Ergebnis 1.000.000, 1.000.001, 999.999 oder 999.998. | |
T7 |
UPDATE big_table SET c2 = CONCAT(c2,c2,c2); COMMIT;
|
||
T8 | Wenn Q1 jetzt beendet wird, ist das Ergebnis 1.000.000. | Wenn Q2 jetzt beendet wird, ist das Ergebnis 1.000.000, 1.000.001, 999.999 oder möglicherweise eine höhere Zahl. | |
T9 | Q3: SELECT COUNT(*) FROM big_table; |
Q4: SELECT COUNT(*) FROM big_table; |
|
T10 | Wenn Q3 jetzt beendet wird, ist das Ergebnis 999.999. | Wenn Q4 jetzt beendet wird, ist das Ergebnis 999.999. | |
T11 | Q5: SELECT COUNT(*) FROM parent_table p JOIN child_table c ON (p.id = c.id) WHERE p.id = 1000; |
Q6: SELECT COUNT(*) FROM parent_table p JOIN child_table c ON (p.id = c.id) WHERE p.id = 1000; |
|
T12 |
INSERT INTO parent_table (id, s) VALUES (1000, 'hello'); INSERT INTO child_table (id, s) VALUES
(1000, 'world'); COMMIT;
|
||
T13 | Wenn Q5 jetzt beendet wird, ist das Ergebnis 0. | Wenn Q6 jetzt beendet wird, ist das Ergebnis 0 oder 1. |
Wenn die Abfragen schnell abgeschlossen werden, bevor andere Transaktionen DML Anweisungen ausführen und festschreiben, sind die Ergebnisse vorhersehbar und zwischen der primären Instance und der Aurora Replica identisch. Sehen wir uns die Verhaltensunterschiede im Detail an, beginnend mit der ersten Abfrage.
Die Ergebnisse für Q1 sind äußerst vorhersehbar, weil READ COMMITTED
auf der primären Instance ein starkes Konsistenzmodell ähnlich der Isolierungsstufe REPEATABLE READ
verwendet.
Die Ergebnisse für Q2 können je nachdem, welche Transaktionen während der Ausführung der Abfrage Commits durchführen, abweichen. Nehmen wir zum Beispiel an, dass andere Transaktionen DML Anweisungen ausführen und festschreiben, während die Abfragen ausgeführt werden. In diesem Fall kann es sein, dass die Abfrage auf der Aurora-Replica mit Isolierungsstufe READ COMMITTED
die Änderungen berücksichtigt oder nicht. Die Zeilenanzahlen sind dabei nicht in der gleichen Weise vorhersagbar wie bei Isolierungsstufe REPEATABLE READ
. Sie sind auch nicht so vorhersehbar wie Abfragen, die unter der READ COMMITTED
Isolationsstufe auf der primären Instance oder auf einer RDS SQL ForMy-Instance ausgeführt werden.
Die UPDATE
-Anweisung bei T7 ändert die Anzahl der Zeilen in der Tabelle nicht. Durch die Änderung der Länge einer Spalte mit variabler Länge kann diese Anweisung jedoch dazu führen, dass Zeilen intern umorganisiert werden. Eine lang andauernde READ COMMITTED
-Transaktion kann zunächst die alte Version einer Zeile und später im Rahmen derselben Transaktion eine neue Version derselben Zeile sehen. Die Abfrage kann auch die alte und die neue Version der Zeile überspringen, so dass die Anzahl der Zeilen von der erwarteten abweicht.
Die Ergebnisse von Q5 und Q6 können identisch oder leicht abweichend sein. Abfrage Q6 auf der Aurora-Replica unter READ
COMMITTED
kann, muss aber nicht, die neuen Zeilen sehen, für die während der Dauer der Abfrage ein Commit durchgeführt wird. Möglicherweise sieht sie auch die Zeile aus einer, aber nicht aus der anderen Tabelle. Wenn die Join-Abfrage keine übereinstimmende Zeile in beiden Tabellen findet, gibt sie die Anzahl 0 zurück. Wenn die Abfrage beide neuen Zeilen in PARENT_TABLE
und CHILD_TABLE
findet, gibt sie die Anzahl 1 zurück. In einer lang andauernden Anfrage können die Lookups aus den verbundenen Tabellen zu weit auseinanderliegenden Zeitpunkten stattfinden.
Anmerkung
Diese Verhaltensunterschiede hängen davon ab, wann für Transaktionen Commits durchgeführt werden, und wann die Abfragen die zugrunde liegenden Tabellenzeilen abfragen. Daher ist es am wahrscheinlichsten, dass Sie solche Unterschiede bei Berichtsabfragen feststellen, die Minuten oder Stunden dauern und auf Aurora-Clustern ausgeführt werden, die gleichzeitig OLTP Transaktionen verarbeiten. Dies sind die Arten gemischter Workloads, die am meisten von der Isolierungsstufe READ COMMITTED
auf Aurora-Replicas profitieren.