Vergleich der Isolationsstufen in Babelfish und SQL Server
Im Folgenden finden Sie einige Beispiele für die Nuancen der Implementierung der ANSI-Isolationsstufen durch SQL Server und Babelfish.
Anmerkung
Die Isolationsstufen
REPEATABLE READundSNAPSHOTsind in Babelfish identisch.Die Isolationsstufen
READ UNCOMMITTEDundREAD COMMITTEDsind in Babelfish identisch.
Im folgenden Beispiel wird gezeigt, 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
Die Isolationsstufe READ UNCOMMITTED in Babelfish im Vergleich zur Isolationsstufe READ UNCOMMITTED in SQL Server
Die folgende Tabelle enthält Details zu den „Dirty Reads“, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe READ UNCOMMITTED in SQL Server im Vergleich zur Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | READ UNCOMMITTED in SQL Server |
READ UNCOMMITTED in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Update erfolgreich |
Update erfolgreich |
|
Leerlauf in Transaktion |
|
Einfügen erfolgreich |
Einfügen erfolgreich |
|
|
Leerlauf in Transaktion |
Transaktion 1 kann nicht festgeschriebene Änderungen aus Transaktion 2 sehen. |
Wie bei |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Sieht die von Transaktion 2 festgeschriebenen Änderungen |
Sieht die von Transaktion 2 festgeschriebenen Änderungen |
Die Isolationsstufe READ COMMITTED in Babelfish im Vergleich zur Isolationsstufe READ COMMITTED in SQL Server
Die folgende Tabelle enthält Details zum Verhalten beim Blockieren von Lese-/Schreibvorgängen, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe READ COMMITTED in SQL Server im Vergleich zur Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | READ COMMITTED in SQL Server |
READ COMMITTED in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Update erfolgreich |
Update erfolgreich |
|
|
Leerlauf in Transaktion |
Der Schritt ist blockiert, bis Transaktion 2 festgeschrieben wird. |
Die Änderungen an Transaktion 2 sind noch nicht sichtbar. Aktualisiert die Zeile mit id=3 |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt nicht mehr blockiert und sieht das Update von Transaktion 2. |
Transaktion 2 wird erfolgreich festgeschrieben. |
|
|
Leerlauf in Transaktion |
Transaktion 1 aktualisiert die Zeile mit id = 1. |
Transaktion 1 aktualisiert die Zeile mit id = 3. |
Die Isolationsstufe READ COMMITTED in Babelfish im Vergleich zur Isolationsstufe READ COMMITTED SNAPSHOT in SQL Server
Die folgende Tabelle enthält Details zum Blockierverhalten der neu eingefügten Zeilen, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe READ COMMITTED SNAPSHOT in SQL Server im Vergleich zur READ COMMITTED-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | READ COMMITTED SNAPSHOT in SQL Server |
READ COMMITTED in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
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. |
|
|
Leerlauf in Transaktion |
Festschreiben erfolgreich. Transaktion 2 ist jetzt nicht mehr blockiert. |
Festschreiben erfolgreich |
|
Leerlauf in Transaktion |
|
Alle 4 Zeilen haben age=99. |
Die Zeile mit id = 4 hat den Age-Wert 40, da sie während der Update-Abfrage für Transaktion 2 nicht sichtbar war. Andere Zeilen werden auf age=99 aktualisiert. |
Die Isolationsstufe REPEATABLE READ in Babelfish im Vergleich zur Isolationsstufe REPEATABLE READ in SQL Server
Die folgende Tabelle enthält Details zum Verhalten beim Blockieren von Lese-/Schreibvorgängen, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe REPEATABLE READ in SQL Server im Vergleich zur REPEATABLE READ-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | REPEATABLE READ in SQL Server |
REPEATABLE READ in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird. |
Transaktion 2 wird normal fortgesetzt. |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Das Update von Transaktion 1 ist sichtbar. |
Das Update von Transaktion 1 ist nicht sichtbar. |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Sieht das Update von Transaktion 1 |
Sieht das Update von Transaktion 1 |
Die folgende Tabelle enthält Details zum Verhalten beim Blockieren von Schreib-/Schreibvorgängen, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe REPEATABLE READ in SQL Server im Vergleich zur REPEATABLE READ-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | REPEATABLE READ in SQL Server |
REPEATABLE READ in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 wurde blockiert. |
Transaktion 2 wurde blockiert. |
|
|
Leerlauf in Transaktion |
Das Festschreiben war erfolgreich und Transaktion 2 ist nicht mehr blockiert. |
Das Festschreiben war erfolgreich und Transaktion 2 schlägt fehl mit dem Fehler: could not serialize access due to concurrent update. |
|
Leerlauf in Transaktion |
|
Festschreiben erfolgreich |
Transaktion 2 wurde bereits abgebrochen. |
|
Leerlauf in Transaktion |
|
Die Zeile mit id=1 hat name='A_TX2'. |
Die Zeile mit id=1 hat name='A_TX1'. |
Die folgende Tabelle enthält Details zum Verhalten bei Phantomlesevorgängen, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe REPEATABLE READ in SQL Server im Vergleich zur REPEATABLE READ-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | REPEATABLE READ in SQL Server |
REPEATABLE READ in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird ohne jegliche Blockierung fortgesetzt. |
Transaktion 2 wird ohne jegliche Blockierung fortgesetzt. |
|
Leerlauf in Transaktion |
|
Die neu eingefügte Zeile ist sichtbar. |
Die neu eingefügte Zeile ist sichtbar. |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Die von Transaktion 2 eingefügte neue Zeile ist sichtbar. |
Die von Transaktion 2 eingefügte neue Zeile ist nicht sichtbar. |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Die neu eingefügte Zeile ist sichtbar. |
Die neu eingefügte Zeile ist sichtbar. |
Die folgende Tabelle enthält Details zur Ausführung gleichzeitiger Transaktionen und zu den unterschiedlichen Endergebnissen bei Verwendung der Isolationsstufe REPEATABLE READ in SQL Server im Vergleich zur REPEATABLE READ-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | REPEATABLE READ in SQL Server |
REPEATABLE READ in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 aktualisiert die Zeile mit id 1. |
Transaktion 1 aktualisiert die Zeile mit id 1. |
|
Leerlauf in Transaktion |
|
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 id = 3 aktualisiert wird, da die Änderungen von Transaktion 1 noch nicht sichtbar sind. |
|
Leerlauf in Transaktion |
|
Dieser Schritt wird ausgeführt, nachdem Transaktion 1 festgeschrieben wurde. Die Zeile mit id = 1 wurde durch Transaktion 2 im vorherigen Schritt aktualisiert und ist hier sichtbar. |
Die Zeile mit id = 3 wird durch Transaktion 2 aktualisiert. |
|
|
Leerlauf in Transaktion |
Transaktion 2 ist jetzt nicht mehr blockiert. |
Festschreiben erfolgreich |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Beide Transaktionen führen das Update für die Zeile mit id = 1 aus. |
Verschiedene Zeilen werden durch Transaktion 1 und 2 aktualisiert. |
Die Isolationsstufe SERIALIZABLE in Babelfish im Vergleich zur Isolationsstufe SERIALIZABLE in SQL Server
Die folgende Tabelle enthält Details zu den Bereichssperren, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe SERIALIZABLE in SQL Server im Vergleich zur SERIALIZABLE-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | SERIALIZABLE in SQL Server |
SERIALIZABLE in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird. |
Transaktion 2 wird ohne jegliche Blockierung fortgesetzt. |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 wird erfolgreich festgeschrieben. Transaktion 2 ist jetzt nicht mehr blockiert. |
Transaktion 1 wird erfolgreich festgeschrieben. |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Die neu eingefügte Zeile ist sichtbar. |
Die neu eingefügte Zeile ist sichtbar. |
Die folgende Tabelle enthält Details zur Ausführung gleichzeitiger Transaktionen und zu den unterschiedlichen Endergebnissen bei Verwendung der Isolationsstufe SERIALIZABLE in SQL Server im Vergleich zur SERIALIZABLE-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | SERIALIZABLE in SQL Server |
SERIALIZABLE in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird. |
Transaktion 1 wird ohne jegliche Blockierung fortgesetzt. |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt nicht mehr blockiert. |
Transaktion 2 wird erfolgreich festgeschrieben. |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Die neu eingefügte Zeile ist mit age value = 99 sichtbar. |
Die neu eingefügte Zeile ist mit age value = 40 sichtbar. |
Die folgende Tabelle enthält Details zum Ausführen von INSERT für eine Tabelle mit eindeutiger Einschränkung. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe SERIALIZABLE in SQL Server im Vergleich zur SERIALIZABLE-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | SERIALIZABLE in SQL Server |
SERIALIZABLE in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird. |
Transaktion 1 ist blockiert, bis Transaktion 2 festgeschrieben wird. |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 ist jetzt nicht mehr blockiert. |
Transaktion 2 wird erfolgreich festgeschrieben. Transaktion 1 wurde abgebrochen mit dem Fehler: duplicate key value violates unique constraint. |
|
|
Leerlauf in Transaktion |
Transaktion 1 wird erfolgreich festgeschrieben. |
Das Festschreiben von Transaktion 1 schlägt fehl mit: could not serialize access due to read or write dependencies among transactions. |
|
|
Leerlauf in Transaktion |
Die 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 aufgrund einer Serialisierungsanomalie fehl, wenn die Ausführung dieser Transaktionen nicht mit allen möglichen seriellen (einzeln ablaufenden) Ausführungen dieser Transaktionen übereinstimmt.
Die folgende Tabelle enthält Details zur Serialisierungsanomalie, wenn gleichzeitige Transaktionen ausgeführt werden. Sie zeigt die beobachteten Ergebnisse bei der Verwendung der Isolationsstufe SERIALIZABLE in SQL Server im Vergleich zur SERIALIZABLE-Babelfish-Implementierung.
| Transaktion 1 | Transaktion 2 | SERIALIZABLE in SQL Server |
SERIALIZABLE in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird. |
Transaktion 2 wird ohne jegliche Blockierung fortgesetzt. |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 wird erfolgreich festgeschrieben. |
Transaktion 1 wird zuerst festgeschrieben und kann erfolgreich festgeschrieben werden. |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird erfolgreich festgeschrieben. |
Das Festschreiben von Transaktion 2 schlägt mit einem Serialisierungsfehler fehl. Die gesamte Transaktion wurde zurückgesetzt. Transaktion 2 wird wiederholt. |
|
|
Leerlauf in Transaktion |
Änderungen aus beiden Transaktionen sind sichtbar. |
Transaktion 2 wurde zurückgesetzt. Nur Änderungen an Transaktion 1 werden gesehen. |
In Babelfish ist eine Serialisierungsanomalie nur möglich, wenn alle gleichzeitigen Transaktionen auf der Isolationsstufe SERIALIZABLE ausgeführt werden. In der folgenden Tabelle nehmen wir das obige Beispiel, setzen aber stattdessen Transaktion 2 auf die Isolationsstufe REPEATABLE READ.
| Transaktion 1 | Transaktion 2 | Isolationsstufen in SQL Server | Isolationsstufen in Babelfish |
|---|---|---|---|
|
|
|
Keine |
Keine |
|
|
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Keine |
Keine |
|
Leerlauf in Transaktion |
|
Transaktion 2 ist blockiert, bis Transaktion 1 festgeschrieben wird. |
Transaktion 2 wird ohne jegliche Blockierung fortgesetzt. |
|
Leerlauf in Transaktion |
|
Keine |
Keine |
|
|
Leerlauf in Transaktion |
Transaktion 1 wird erfolgreich festgeschrieben. |
Transaktion 1 wird erfolgreich festgeschrieben. |
|
Leerlauf in Transaktion |
|
Transaktion 2 wird erfolgreich festgeschrieben. |
Transaktion 2 wird erfolgreich festgeschrieben. |
|
|
Leerlauf in Transaktion |
Änderungen aus beiden Transaktionen sind sichtbar. |
Änderungen aus beiden Transaktionen sind sichtbar. |