Vergleich der Isolationsstufen von Babelfish und SQL Servern - Amazon Aurora

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.

Vergleich der Isolationsstufen von Babelfish und SQL Servern

Im Folgenden finden Sie einige Beispiele für die Nuancen bei der Implementierung der Isolationsstufen durch SQL Server und Babelfish. ANSI

Anmerkung
  • Isolation Level Repeatable Read und Snapshot sind in Babelfish identisch.

  • Die Isolationsstufen Read Uncommitted und Read Committed sind in Babelfish identisch.

Das folgende Beispiel zeigt, wie die Basistabelle für alle unten genannten Beispiele erstellt wird:

CREATE TABLE employee ( id sys.INT NOT NULL PRIMARY KEY, name sys.VARCHAR(255)NOT NULL, age sys.INT NOT NULL ); INSERT INTO employee (id, name, age) VALUES (1, 'A', 10); INSERT INTO employee (id, name, age) VALUES (2, 'B', 20); INSERT INTO employee (id, name, age) VALUES (3, 'C', 30);

BABELFISHREADUNCOMMITTEDVS SQL SERVER READ UNCOMMITTED ISOLATION LEVEL

DIRTYREADSIM SQL SERVER
Transaktion 1 Transaktion 2 SQLServerlesevorgang: Nicht bestätigt Babelfish Read Uncommitted

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

UPDATEAlter des Mitarbeiters = 0; SET

Aktualisierung erfolgreich.

Aktualisierung erfolgreich.

INSERTINTOMitarbeiter VALUES (4, 'D', 40);

Einfügen erfolgreich.

Einfügen erfolgreich.

SELECT* FROM Mitarbeiter;

In Transaktion 1 können noch nicht festgeschriebene Änderungen aus Transaktion 2 angezeigt werden.

Entspricht Read Committed in Babelfish. Nicht festgeschriebene Änderungen aus Transaktion 2 sind für Transaktion 1 nicht sichtbar.

COMMIT

SELECT* FROM Mitarbeiter;

Sieht die durch Transaktion 2 festgeschriebenen Änderungen.

Sieht die von Transaktion 2 festgeschriebenen Änderungen.

BABELFISHREADCOMMITTEDVS SQL SERVER READ COMMITTED ISOLATION LEVEL

READ - WRITE BLOCKING
Transaktion 1 Transaktion 2 SQLServerlesevorgang bestätigt Babelfish hat gelesen und bestätigt

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT* Mitarbeiter; FROM

UPDATESETAlter des Mitarbeiters = 100 WHERE id = 1;

Aktualisierung erfolgreich.

Aktualisierung erfolgreich.

UPDATESETAlter des Mitarbeiters = 0 WHERE Alter IN SELECT MAX ((Alter) FROM Mitarbeiter);

Schritt blockiert, bis Transaktion 2 festgeschrieben wird.

Die Änderungen an Transaktion 2 sind noch nicht sichtbar. Aktualisiert die Zeile mit id=3.

COMMIT

Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt entsperrt und es wird das Update von Transaktion 2 übernommen.

Transaktion 2 wird erfolgreich festgeschrieben.

SELECT* FROM Mitarbeiter;

Transaktion 1 aktualisiert die Zeile mit der ID = 1.

Transaktion 1 aktualisiert die Zeile mit der ID = 3.

BABELFISHREADCOMMITTEDVS SQL SERVER READ COMMITTED SNAPSHOT ISOLATION LEVEL

BLOCKINGBEHAVIOURAUF NEW INSERTED ROWS
Transaktion 1 Transaktion 2 SQLFestgeschriebener Snapshot vom Server gelesen Babelfish hat den Lesevorgang bestätigt

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

INSERTINTOMitarbeiter VALUES (4, „D“, 40);

UPDATESETAlter des Mitarbeiters = 99;

Der Schritt ist blockiert, bis Transaktion 1 festgeschrieben wird. Die eingefügte Zeile ist durch Transaktion 1 gesperrt.

Drei Zeilen wurden aktualisiert. Die neu eingefügte Zeile ist noch nicht sichtbar.

COMMIT

Der Commit war erfolgreich. Transaktion 2 ist jetzt entsperrt.

Der Commit war erfolgreich.

SELECT* FROM Mitarbeiter;

Alle 4 Zeilen haben Alter=99.

Die Zeile mit der ID = 4 hat den Alterswert 40, da sie während der Aktualisierungsabfrage für Transaktion 2 nicht sichtbar war. Andere Zeilen werden auf Alter=99 aktualisiert.

BABELFISHREPEATABLEREADVS SQL SERVER REPEATABLE READ ISOLATION LEVEL

READ / WRITE BLOCKING BEHAVIOR
Transaktion 1 Transaktion 2 SQLWiederholbarer Lesevorgang auf dem Server Wiederholbares Lesen mit Babelfish

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT* Mitarbeiter; FROM

UPDATESETName des Mitarbeiters TXN1 ='A_ 'ID=1; WHERE

SELECTFROM* WHERE Mitarbeiter-ID! = 1;

SELECT* FROM Mitarbeiter;

Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird.

Transaktion 2 läuft normal ab.

COMMIT

SELECT* FROM Mitarbeiter;

Das Update von Transaktion 1 ist sichtbar.

Das Update von Transaktion 1 ist nicht sichtbar.

COMMIT

SELECT* FROM Mitarbeiter;

sieht das Update von Transaktion 1.

sieht das Update von Transaktion 1.

WRITE / WRITE BLOCKING BEHAVIOR
Transaktion 1 Transaktion 2 SQLWiederholbarer Lesevorgang auf dem Server Wiederholbares Lesen mit Babelfish

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

UPDATESETName des Mitarbeiters ='A_ 'ID=1; TXN1 WHERE

UPDATESETMitarbeitername='A_ TXN2 'WHEREID=1;

Transaktion 2 wurde blockiert.

Transaktion 2 wurde blockiert.

COMMIT

Die Übertragung war erfolgreich und Transaktion 2 wurde entsperrt.

Die Übertragung war erfolgreich und Transaktion 2 schlägt fehl. Der Zugriff konnte aufgrund der gleichzeitigen Aktualisierung nicht serialisiert werden.

COMMIT

Der Commit war erfolgreich.

Transaktion 2 wurde bereits abgebrochen.

SELECT* FROM Mitarbeiter;

Zeile mit id=1 hat TX2 Name='A_ '.

Zeile mit ID=1 hat Name='A_ '. TX1

PHANTOM READ
Transaktion 1 Transaktion 2 SQLWiederholbarer Lesevorgang auf dem Server Wiederholbares Lesen mit Babelfish

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT* Mitarbeiter; FROM

INSERTINTOMitarbeiter VALUES (4, 'NewRowName', 20);

Transaktion 2 wird ohne jegliche Blockierung ausgeführt.

Transaktion 2 wird ohne jegliche Blockierung fortgesetzt.

SELECT* FROM Mitarbeiter;

Die neu eingefügte Zeile ist sichtbar.

Die neu eingefügte Zeile ist sichtbar.

COMMIT

SELECT* FROM Mitarbeiter;

Die durch Transaktion 2 eingefügte neue Zeile ist sichtbar.

Die von Transaktion 2 eingefügte neue Zeile ist nicht sichtbar.

COMMIT

SELECT* FROM Mitarbeiter;

Die neu eingefügte Zeile ist sichtbar.

Die neu eingefügte Zeile ist sichtbar.

DIFFERENT FINAL RESULTS
Transaktion 1 Transaktion 2 SQLWiederholbarer Lesevorgang auf dem Server Wiederholbares Lesen mit Babelfish

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

UPDATESETAlter des Mitarbeiters = 100 WHERE Jahre IN (SELECTMIN(Alter) des Mitarbeiters); FROM

Transaktion 1 aktualisiert die Zeile mit der ID 1.

Transaktion 1 aktualisiert die Zeile mit der ID 1.

UPDATESETAlter des Mitarbeiters = 0 WHERE Alter IN SELECT MAX ((Alter) FROM Mitarbeiter);

Transaktion 2 ist blockiert, da die SELECT Anweisung versucht, Zeilen zu lesen, die durch die UPDATE Abfrage in Transaktion 1 gesperrt wurden.

Transaktion 2 wird ohne Blockierung fortgesetzt, da der Lesevorgang nie blockiert wird, die SELECT Anweisung ausgeführt wird und schließlich die Zeile mit der ID = 3 aktualisiert wird, da die Änderungen in Transaktion 1 noch nicht sichtbar sind.

SELECT* FROM Mitarbeiter;

Dieser Schritt wird ausgeführt, nachdem Transaktion 1 festgeschrieben wurde. Die Zeile mit der ID = 1 wurde durch Transaktion 2 im vorherigen Schritt aktualisiert und ist hier sichtbar.

Die Zeile mit der ID = 3 wird durch Transaktion 2 aktualisiert.

COMMIT

Transaktion 2 ist jetzt entsperrt.

Der Commit war erfolgreich.

COMMIT

SELECT* FROM Mitarbeiter;

Beide Transaktionen führen ein Update für eine Zeile mit der ID = 1 aus.

Verschiedene Zeilen werden durch Transaktion 1 und 2 aktualisiert.

BABELFISHSERIALIZABLEVS SQL SERVER SERIALIZABLE ISOLATION LEVEL

RANGELOCKSIM SQL SERVER
Transaktion 1 Transaktion 2 SQLServer serialisierbar Babelfish serialisierbar

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SELECT* FROM Mitarbeiter;

INSERTINTOMitarbeiter VALUES (4, „D“, 35);

Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird.

Transaktion 2 wird ohne Blockierung fortgesetzt.

SELECT* FROM Mitarbeiter;

COMMIT

Transaktion 1 wird erfolgreich festgeschrieben. Transaktion 2 ist jetzt entsperrt.

Transaktion 1 wird erfolgreich festgeschrieben.

COMMIT

SELECT* FROM Mitarbeiter;

Die neu eingefügte Zeile ist sichtbar.

Die neu eingefügte Zeile ist sichtbar.

DIFFERENT FINAL RESULTS
Transaktion 1 Transaktion 2 SQLServer serialisierbar Babelfish serialisierbar

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

INSERTINTOMitarbeiter VALUES (4, 'D', 40);

UPDATESETAlter des Mitarbeiters =99 WHERE id = 4;

Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird.

Transaktion 1 wird ohne Blockierung fortgesetzt.

COMMIT

Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt entsperrt.

Transaktion 2 wird erfolgreich festgeschrieben.

COMMIT

SELECT* FROM Mitarbeiter;

Die neu eingefügte Zeile ist mit dem Alterswert = 99 sichtbar.

Die neu eingefügte Zeile ist mit dem Alterswert = 40 sichtbar.

INSERT INTO TABLE WITH UNIQUE CONSTRAINT
Transaktion 1 Transaktion 2 SQLServer serialisierbar Babelfish serialisierbar

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

INSERTINTOMitarbeiter VALUES (4, 'D', 40);

INSERTINTOMitarbeiter VALUES ((SELECTMAX(id) +1 FROM Mitarbeiter), 'E', 50);

Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird.

Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird.

COMMIT

Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt entsperrt.

Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 wurde mit dem Fehler „Doppelter Schlüsselwert verletzt eindeutige Einschränkung“ abgebrochen.

COMMIT

Transaktion 1 wird erfolgreich festgeschrieben.

Transaktion 1 schlägt fehl, da der Zugriff aufgrund von Lese-/Schreibabhängigkeiten zwischen den Transaktionen nicht serialisiert werden konnte.

SELECT* Mitarbeiter; FROM

Zeile (5, 'E', 50) wird eingefügt.

Es sind nur 4 Zeilen vorhanden.

In Babelfish schlagen gleichzeitige Transaktionen, die mit der Isolationsstufe serializable ausgeführt werden, mit einem Fehler bei der Serialisierungsanomalie fehl, wenn die Ausführung dieser Transaktionen nicht mit allen möglichen seriellen (nacheinander) Ausführungen dieser Transaktionen übereinstimmt.

SERIALIZATION ANOMALY
Transaktion 1 Transaktion 2 SQLServer serialisierbar Babelfish serialisierbar

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SELECT* FROM Mitarbeiter;

UPDATESETAlter des Mitarbeiters = 5, Alter = 10; WHERE

SELECTFROM* Mitarbeiter;

Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird.

Transaktion 2 wird ohne Blockierung fortgesetzt.

UPDATESETAlter des Mitarbeiters = 35 Alter = 30; WHERE

COMMIT

Transaktion 1 wurde erfolgreich festgeschrieben.

Transaktion 1 wird zuerst festgeschrieben und kann erfolgreich festgeschrieben werden.

COMMIT

Transaktion 2 wird erfolgreich festgeschrieben.

Die Übertragung von Transaktion 2 schlägt mit einem Serialisierungsfehler fehl. Die gesamte Transaktion wurde zurückgesetzt. Versuchen Sie Transaktion 2 erneut.

SELECT* FROM Mitarbeiter;

Änderungen aus beiden Transaktionen sind sichtbar.

Transaktion 2 wurde rückgängig gemacht. Es werden nur Änderungen an Transaktion 1 angezeigt.

In Babelfish ist eine Serialisierungsanomalie nur möglich, wenn alle gleichzeitigen Transaktionen auf Isolationsebene ausgeführt werden. SERIALIZABLE Nehmen wir zum Beispiel das obige Beispiel, setzen aber stattdessen Transaktion 2 auf Isolationsstufe. REPEATABLE READ

Transaktion 1 Transaktion 2 SQLIsolationsstufen für Server Isolationsstufen für Babelfish

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT* Mitarbeiter; FROM

UPDATESETAlter des Mitarbeiters = 5, Alter = 10; WHERE

SELECTFROM* Mitarbeiter;

Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird.

Transaktion 2 wird ohne Blockierung fortgesetzt.

UPDATESETAlter des Mitarbeiters = 35 Alter = 30; WHERE

COMMIT

Transaktion 1 wurde erfolgreich festgeschrieben.

Transaktion 1 wird erfolgreich festgeschrieben.

COMMIT

Transaktion 2 wird erfolgreich festgeschrieben.

Transaktion 2 wird erfolgreich festgeschrieben.

SELECT* FROM Mitarbeiter;

Änderungen aus beiden Transaktionen sind sichtbar.

Änderungen aus beiden Transaktionen sind sichtbar.