Direkt zum Inhalt

Wie behebe ich den Fehler "Serializable isolation violation on table" oder "Relation does not exist" in Amazon Redshift?

Lesedauer: 4 Minute
0

Wenn ich Amazon Redshift-Vorgänge in verschiedenen Sitzungen gleichzeitig ausführe, erhalte ich den Fehler "Serializable isolation violation on table" oder "Relation does not exist".

Kurzbeschreibung

Gleichzeitige Schreibvorgänge in Amazon Redshift müssen serialisierbar sein, damit Transaktionen anschließend ausgeführt werden können. Die serielle Ausführung muss außerdem dieselben Ergebnisse liefern wie bei gleichzeitiger Ausführung der Transaktionen. Weitere Informationen findest du unter Serialisierbare Isolation.

Lösung

Verwende eine der folgenden Methoden, um serialisierbare Isolationsfehler zu beheben.

Stornierte Transaktionen erneut versuchen

Wenn Amazon Redshift feststellt, dass ein gleichzeitiger Workload nicht serialisierbar ist, kann es zu Lücken in der Anwendungslogik kommen. Versuche erneut, die stornierte Transaktion durchzuführen, die den Fehler verursacht hat.

Zwischen-Commits verwenden

Wenn ein Commit oder Rollback ausgegeben wird, wird die Transaktion abgeschlossen. Wenn eine Transaktion festgeschrieben wird, bevor der Vorgang zum Löschen aus der Tabelle ausgeführt wird, wird eine neue Transaktion erstellt und die serialisierbare Isolierung bleibt erhalten.

Im folgenden Beispiel wird ein COMMIT-Zwischenbefehl verwendet:

DELETE FROM XXXXX WHERE date = XXXXX';
→COMMIT;
BEGIN TRANSACTION;
DELETE FROM XXXXX WHERE date = XXXXX';

Nichtatomare Vorgänge aus der Transaktion verschieben

Verwende 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.

Wenn die Ergebnisse nicht atomar mit anderen Vorgängen sein müssen, verschiebe SELECT-Anweisungen außerhalb ihrer Transaktionen.

Im folgenden Beispiel werden die SELECT-Anweisungen außerhalb ihrer Transaktionen verschoben:

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;

Die vorhergehenden Transaktionen sind serialisierbar. Wenn du die Transaktionen nacheinander ausführst, sind die Ergebnisse dieselben wie bei der gleichzeitigen Ausführung.

Alle Tabellen in jeder Sitzung sperren, um die Serialisierung zu erzwingen

Der Befehl LOCK blockiert Operationen, die zu serialisierbaren Isolationsfehlern führen können. Wenn du den Befehl LOCK ausführst, führst du die folgenden Schritte aus:

  • Sperre alle Tabellen, die von der Transaktion betroffen sind, und schließe Tabellen ein, auf die sich schreibgeschützte SELECT-Anweisungen innerhalb der Transaktion auswirken.
  • Sperre Tabellen in derselben Reihenfolge, unabhängig von der Reihenfolge, in der die Vorgänge ausgeführt werden.
  • Bevor du Vorgänge ausführst, sperre alle Tabellen zu Beginn der Transaktion.

Verwenden der Snapshot-Isolierung für gleichzeitige Transaktionen

Die serialisierbare Isolierung implementiert eine strikte Serialisierung. Eine Transaktion kann fehlschlagen, wenn Amazon Redshift das Ergebnis nicht auf eine serielle Reihenfolge der gleichzeitig laufenden Transaktionen abbilden kann.

Die 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.

Du legst die Snapshot-Isolation für die Datenbank fest und schließt den Parameter ISOLATION LEVEL in den Befehl CREATE DATABASE oder ALTER DATABASE ein.

Führe die folgende STV_DB_ISOLATION_LEVEL-Abfrage aus, um das Parallelitätsmodell anzuzeigen, das deine Datenbank verwendet:

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

Wenn du die Isolationsstufe einer Datenbank änderst, verwende die folgenden bewährten Methoden:

  • Um die Datenbank-Isolationsstufe zu ändern, benötigst du die Superuser- oder CREATE DATABASE-Berechtigung.
  • Du kannst die Isolationsstufe der Datenbankumgebung nicht ändern.
  • Du kannst die Isolationsstufe innerhalb eines Transaktionsblocks nicht ändern.
  • Der Befehl „alter isolation level“ schlägt fehl, wenn andere Benutzer eine Verbindung zur Datenbank herstellen.
  • Der Befehl „alter isolation level“ kann die Isolationsstufen-Einstellungen der aktuellen Sitzung ändern.

Weitere Informationen findest du unter So behebst du Fehler bei der serialisierbaren Isolation.

Ähnliche Informationen

ERROR:1023 DETAIL: Serializable isolation violation on a table in Redshift

ERROR:1018 DETAIL: Relation does not exist

Verwalten gleichzeitiger Schreiboperationen

AWS OFFICIALAktualisiert vor 6 Monaten