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);
Themen
- BABELFISHREADUNCOMMITTEDVS SQL SERVER READ UNCOMMITTED ISOLATION LEVEL
- BABELFISHREADCOMMITTEDVS SQL SERVER READ COMMITTED ISOLATION LEVEL
- BABELFISHREADCOMMITTEDVS SQL SERVER READ COMMITTED SNAPSHOT ISOLATION LEVEL
- BABELFISHREPEATABLEREADVS SQL SERVER REPEATABLE READ ISOLATION LEVEL
- BABELFISHSERIALIZABLEVS SQL SERVER SERIALIZABLE ISOLATION LEVEL
BABELFISHREADUNCOMMITTEDVS SQL SERVER READ UNCOMMITTED ISOLATION LEVEL
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
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
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
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. |
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 |
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. |
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
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. |
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. |
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.
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. |