Wie behebe ich den Fehler „ERROR: 1023 DETAIL: Serialisierbare Isolationsverletzung in einer Tabelle in Redshift“?

Lesedauer: 4 Minute
0

Wenn ich gleichzeitig Amazon Redshift-Operationen in verschiedenen Sitzungen ausführe, erhalte ich die Meldung „ERROR: 1023 DETAIL: Serialisierbare Isolationsverletzung in einer Tabelle in Redshift.“ Wie behebe ich diesen Fehler?

Kurzbeschreibung

Gleichzeitige Schreibvorgänge in Amazon Redshift müssen serialisierbar sein. Das bedeutet, dass es möglich sein muss, dass die Transaktionen seriell in mindestens einer Reihenfolge ausgeführt werden, die zu den gleichen Ergebnissen führt, als ob die Transaktionen gleichzeitig ausgeführt würden. Weitere Informationen finden Sie unter Serialisierbare Isolation.

Verwenden Sie eine oder alle der folgenden Methoden, um serialisierbare Isolationsfehler zu beheben:

  • Verschieben von Operationen, die aus Gründen der Atomizität nicht in derselben Transaktion enthalten sein müssen, sodass sie sich außerhalb der Transaktion befinden
  • Erzwingen der Serialisierung, indem Sie alle Tabellen in jeder Sitzung sperren
  • Verwenden der Snapshot-Isolierung für gleichzeitige Transaktionen

Lösung

Verschieben von Operationen, die aus Gründen der Atomizität nicht in derselben Transaktion enthalten sein müssen, sodass sie sich außerhalb der Transaktion befinden

Verwenden Sie diese Methode, wenn sich einzelne Operationen innerhalb von zwei Transaktionen in einer Weise gegenseitig verweisen, die sich auf das Ergebnis der anderen Transaktion auswirken könnte. Nehmen wir zum Beispiel an, dass zwei Sitzungen jeweils eine Transaktion starten:

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

Das Ergebnis der SELECT-Anweisung in jeder Transaktion kann durch die INSERT-Anweisung in der anderen Transaktion beeinflusst werden. Bei serieller Ausführung in beliebiger Reihenfolge gibt das Ergebnis einer SELECT-Anweisung immer eine Zeile mehr zurück, als wenn die Transaktionen gleichzeitig ausgeführt werden. Da es keine Reihenfolge gibt, in der die Operationen seriell ausgeführt werden können, was zu demselben Ergebnis führen kann wie bei gleichzeitiger Ausführung, führt die letzte ausgeführte Operation zu einem serialisierbaren Isolationsfehler:

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

Wenn das Ergebnis der SELECT-Anweisungen nicht wichtig ist (das heißt, die Atomizität der Operationen in den Transaktionen ist nicht wichtig), verschieben Sie die SELECT-Kontoauszüge so, dass sie außerhalb ihrer Transaktionen liegen. Zum Beispiel:

Session1_Redshift=# BEGIN;
Session1_Redshift = # insert into tab1 values (1)
Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;
Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;

In diesen Beispielen gibt es keine Querverweise in den Transaktionen. Die beiden INSERT-Anweisungen beeinflussen sich nicht gegenseitig. Da es mindestens eine Bestellung gibt, in der die Transaktionen seriell ausgeführt werden können und zu demselben Ergebnis führen, als ob sie gleichzeitig ausgeführt würden, sind die Transaktionen serialisierbar.

Erzwingen der Serialisierung, indem Sie alle Tabellen in jeder Sitzung sperren

Der Befehl LOCK blockiert Operationen, die zu serialisierbaren Isolationsfehlern führen können. Wenn Sie den Befehl LOCK verwenden, gehen Sie unbedingt wie folgt vor:

  • Sperren Sie alle Tabellen, die von der Transaktion betroffen sind, einschließlich der Tabellen, die von schreibgeschützten SELECT-Anweisungen innerhalb der Transaktion betroffen sind.
  • Sperren Sie Tabellen in derselben Reihenfolge, unabhängig von der Reihenfolge, in der die Operationen ausgeführt werden.
  • Sperren Sie alle Tabellen zu Beginn der Transaktion, bevor Sie irgendwelche Operationen ausführen.

Verwenden der Snapshot-Isolierung für gleichzeitige Transaktionen

Die Option SERIALIZABLE implementiert eine strikte Serialisierung, bei der eine Transaktion fehlschlagen kann, wenn das Ergebnis nicht einer seriellen Reihenfolge der gleichzeitig laufenden Transaktionen zugeordnet werden kann.

Die Option SNAPSHOT ISOLATION ermöglicht eine höhere Parallelität, sodass gleichzeitige Änderungen an verschiedenen Zeilen in derselben Tabelle erfolgreich abgeschlossen werden können.

Transaktionen werden weiterhin mit der neuesten übernommenen Version oder einem Snapshot der Datenbank ausgeführt.

Die Snapshot-Isolierung wird in der Datenbank mithilfe des ISOLATION LEVEL-Parameters im Befehl CREATE DATABASE oder ALTER DATABASE festgelegt.

Führen Sie die folgende STV\ _DB\ _ISOLATION\ _LEVEL -Beispielabfrage aus, um das Parallelitätsmodell anzuzeigen, das Ihre Datenbank verwendet:

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

Beachten Sie Folgendes, wenn Sie die Isolationsstufe einer Datenbank ändern:

  • Sie benötigen die Superuser- oder CREATE DATABASE-Berechtigung für die aktuelle Datenbank, um die Datenbank-Isolationsstufe zu ändern.
  • Sie können die Isolationsstufe der DEV-Datenbankumgebung nicht ändern.
  • Sie können die Isolationsstufe innerhalb eines Transaktionsblocks nicht ändern.
  • Der Befehl „alter isolation level“ schlägt fehl, wenn andere Benutzer mit der Datenbank verbunden sind.
  • Der Befehl „alter isolation level“ kann die Isolationsstufen-Einstellungen der aktuellen Sitzung ändern.

Verwandte Informationen

Verwalten gleichzeitiger Schreiboperationen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren