比較 Babelfish 和SQL伺服器隔離層級 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

比較 Babelfish 和SQL伺服器隔離層級

以下是 SQL Server 和 Babelfish 如何實作ANSI隔離層級的細微差異範例。

注意
  • Babelfish 中的隔離層級 REPEATABLE READSNAPSHOT 相同。

  • Babelfish 中的隔離層級 READ UNCOMMITTEDREAD COMMITTED 相同。

下列範例示範如何為下列所有範例建立基礎資料表:

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);

Babelfish 與SQL伺服器READ UNCOMMITTED隔離層級READ UNCOMMITTED的比較

下表提供執行並行交易時,髒污讀取的詳細資訊。與 Babelfish 實作相比,它顯示使用SQL伺服器中的READ UNCOMMITTED隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 READ UNCOMMITTED Babelfish READ UNCOMMITTED

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

交易閒置

UPDATE employee SET age=0;

更新成功。

更新成功。

交易閒置

INSERT INTO employee VALUES (4, 'D', 40);

插入成功。

插入成功。

SELECT * FROM employee;

交易閒置

交易 1 可以看到交易 2 的未遞交變更。

與 Babelfish READ COMMITTED中的相同。交易 1 看不到來自交易 2 的未遞交變更。

交易閒置

COMMIT

SELECT * FROM employee;

交易閒置

查看交易 2 所做的變更。

查看交易 2 所做的變更。

Babelfish 與SQL伺服器READ COMMITTED隔離層級READ COMMITTED的比較

下表提供執行並行交易時讀取寫入封鎖行為的詳細資訊。與 Babelfish 實作相比,它顯示使用SQL伺服器中的READ COMMITTED隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 READ COMMITTED Babelfish READ COMMITTED

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT * FROM employee;

交易閒置

交易閒置

UPDATE employee SET age=100 WHERE id = 1;

更新成功。

更新成功。

UPDATE employee SET age = 0 WHERE age IN (SELECT MAX(age) FROM employee);

交易閒置

步驟被封鎖,直到交易 2 遞交為止。

交易 2 變更尚未顯示。更新 id=3 的資料列。

交易閒置

COMMIT

交易 2 已成功遞交。交易 1 現在已解除封鎖,並查看交易 2 的更新。

交易 2 已成功遞交。

SELECT * FROM employee;

交易閒置

交易 1 更新 ID = 1 的資料列。

交易 1 更新 id = 3 的資料列。

Babelfish 與SQL伺服器READ COMMITTED SNAPSHOT隔離層級READ COMMITTED的比較

下表提供在執行並行交易時,新插入的資料列封鎖行為的詳細資訊。與 READ COMMITTED Babelfish 實作相比,它顯示使用SQL伺服器中的READ COMMITTED SNAPSHOT隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 READ COMMITTED SNAPSHOT Babelfish READ COMMITTED

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

INSERT INTO employee VALUES (4, 'D', 40);

交易閒置

交易閒置

UPDATE employee SET age = 99;

步驟會遭到封鎖,直到交易 1 遞交為止。插入的資料列被交易 1 鎖定。

已更新三列。新插入的資料列尚未顯示。

COMMIT

交易閒置

遞交成功。交易 2 現在已解除封鎖。

遞交成功。

交易閒置

SELECT * FROM employee;

所有 4 列的年齡皆 = 99。

ID = 4 的資料列的年齡值為 40,因為在更新查詢期間交易 2 看不到。其他資料列會更新為 age=99。

Babelfish 與SQL伺服器REPEATABLE READ隔離層級REPEATABLE READ的比較

下表提供執行並行交易時讀取寫入封鎖行為的詳細資訊。其顯示與 REPEATABLE READ Babelfish 實作相比,在SQL伺服器中使用REPEATABLE READ隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 REPEATABLE READ Babelfish REPEATABLE READ

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT * FROM employee;

交易閒置

UPDATE employee SET name='A_TXN1' WHERE id=1;

交易閒置

交易閒置

SELECT * FROM employee WHERE id != 1;

交易閒置

SELECT * FROM employee;

交易 2 會遭到封鎖,直到交易 1 遞交為止。

交易 2 會正常進行。

COMMIT

交易閒置

交易閒置

SELECT * FROM employee;

交易 1 的更新可見。

交易 1 的更新不會顯示。

COMMIT

交易閒置

交易閒置

SELECT * FROM employee;

會看到交易 1 的更新。

會看到交易 1 的更新。

下表提供執行並行交易時寫入封鎖行為的詳細資訊。其顯示與 REPEATABLE READ Babelfish 實作相比,在SQL伺服器中使用REPEATABLE READ隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 REPEATABLE READ Babelfish REPEATABLE READ

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

UPDATE employee SET name='A_TXN1' WHERE id=1;

交易閒置

交易閒置

UPDATE employee SET name='A_TXN2' WHERE id=1;

交易 2 已封鎖。

交易 2 已封鎖。

COMMIT

交易閒置

遞交成功,交易 2 已解除封鎖。

遞交成功,交易 2 失敗,但由於並行更新,錯誤無法序列化存取。

交易閒置

COMMIT

遞交成功。

交易 2 已中止。

交易閒置

SELECT * FROM employee;

id=1 的資料列具有 name='A_TX2'。

id=1 的資料列的名稱為='A_TX1'。

下表提供在執行並行交易時,模擬讀取行為的詳細資訊。其顯示與 REPEATABLE READ Babelfish 實作相比,在SQL伺服器中使用REPEATABLE READ隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 REPEATABLE READ Babelfish REPEATABLE READ

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT * FROM employee;

交易閒置

交易閒置

INSERT INTO employee VALUES (4, 'NewRowName', 20);

交易 2 繼續進行,而不會有任何封鎖。

交易 2 繼續進行,而不會有任何封鎖。

交易閒置

SELECT * FROM employee;

可看見新插入的資料列。

可看見新插入的資料列。

交易閒置

COMMIT

SELECT * FROM employee;

交易閒置

交易 2 插入的新資料列會顯示。

交易 2 插入的新資料列不會顯示。

COMMIT

交易閒置

SELECT * FROM employee;

交易閒置

可看見新插入的資料列。

可看見新插入的資料列。

下表提供執行並行交易時的詳細資訊,以及與 REPEATABLE READ Babelfish 實作相比,使用 SQL 伺服器中的REPEATABLE READ隔離層級時不同的最終結果。

交易 1 交易 2 SQL 伺服器 REPEATABLE READ Babelfish REPEATABLE READ

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

UPDATE employee SET age = 100 WHERE age IN (SELECT MIN(age) FROM employee);

交易閒置

交易 1 會使用 ID 1 更新資料列。

交易 1 會使用 ID 1 更新資料列。

交易閒置

UPDATE employee SET age = 0 WHERE age IN (SELECT MAX(age) FROM employee);

交易 2 會遭到封鎖,因為SELECT陳述式會嘗試讀取交易 1 中UPDATE查詢鎖定的資料列。

交易 2 不會進行任何封鎖,因為讀取永遠不會遭到封鎖、陳述SELECT式會執行,最後更新 ID = 3 的資料列,因為交易 1 變更尚未顯示。

交易閒置

SELECT * FROM employee;

此步驟會在交易 1 遞交後執行。ID = 1 的資料列會由前一個步驟的交易 2 更新,並在此處顯示。

ID = 3 的資料列會由交易 2 更新。

COMMIT

交易閒置

交易 2 現在已解除封鎖。

遞交成功。

交易閒置

COMMIT

SELECT * FROM employee;

交易閒置

兩個交易都會在 ID = 1 的資料列上執行更新。

交易 1 和 2 會更新不同的資料列。

Babelfish 與SQL伺服器SERIALIZABLE隔離層級SERIALIZABLE的比較

下表提供執行並行交易時範圍鎖定的詳細資訊。與 SERIALIZABLE Babelfish 實作相比,它顯示使用SQL伺服器中的SERIALIZABLE隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 SERIALIZABLE Babelfish SERIALIZABLE

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SELECT * FROM employee;

交易閒置

交易閒置

INSERT INTO employee VALUES (4, 'D', 35);

交易 2 會遭到封鎖,直到交易 1 遞交為止。

交易 2 繼續進行,而沒有任何封鎖。

交易閒置

SELECT * FROM employee;

COMMIT

交易閒置

交易 1 已成功遞交。交易 2 現在已解除封鎖。

交易 1 已成功遞交。

交易閒置

COMMIT

SELECT * FROM employee;

交易閒置

可看見新插入的資料列。

可看見新插入的資料列。

下表提供執行並行交易時的詳細資訊,以及與 SERIALIZABLE Babelfish 實作相比,使用 SQL 伺服器中的SERIALIZABLE隔離層級時不同的最終結果。

交易 1 交易 2 SQL 伺服器 SERIALIZABLE Babelfish SERIALIZABLE

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

交易閒置

INSERT INTO employee VALUES (4, 'D', 40);

UPDATE employee SET age =99 WHERE id = 4;

交易閒置

交易 1 會遭到封鎖,直到交易 2 遞交為止。

交易 1 會繼續進行,而不會有任何封鎖。

交易閒置

COMMIT

交易 2 已成功遞交。交易 1 現在已解除封鎖。

交易 2 已成功遞交。

COMMIT

交易閒置

SELECT * FROM employee;

交易閒置

顯示新插入的資料列,年齡值 = 99。

顯示新插入的資料列,年齡值 = 40。

當您INSERT進入具有唯一限制條件的資料表時,下表會提供詳細資訊。其顯示與 SERIALIZABLE Babelfish 實作相比,在SQL伺服器中使用SERIALIZABLE隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 SERIALIZABLE Babelfish SERIALIZABLE

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

交易閒置

INSERT INTO employee VALUES (4, 'D', 40);

INSERT INTO employee VALUES ((SELECT MAX(id)+1 FROM employee), 'E', 50);

交易閒置

交易 1 會遭到封鎖,直到交易 2 遞交為止。

交易 1 會遭到封鎖,直到交易 2 遞交為止。

交易閒置

COMMIT

交易 2 已成功遞交。交易 1 現在已解除封鎖。

交易 2 已成功遞交。交易 1 因錯誤重複金鑰值而中止,違反了唯一的限制條件。

COMMIT

交易閒置

交易 1 已成功遞交。

交易 1 遞交失敗,由於交易之間的讀取或寫入相依性, 無法序列化存取。

SELECT * FROM employee;

交易閒置

資料列 (5、'E'、50) 已插入。

只有 4 個資料列存在。

在 Babelfish 中,若這些交易的執行與這些交易的所有可能序列 (一次一個) 執行不一致,則以可序列化層級可序列化方式執行的並行交易會失敗。

下表提供執行並行交易時序列化異常的詳細資訊。與 SERIALIZABLE Babelfish 實作相比,它顯示使用SQL伺服器中的SERIALIZABLE隔離層級時觀察到的結果。

交易 1 交易 2 SQL 伺服器 SERIALIZABLE Babelfish SERIALIZABLE

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SELECT * FROM employee;

交易閒置

UPDATE employee SET age=5 WHERE age=10;

交易閒置

交易閒置

SELECT * FROM employee;

交易 2 會遭到封鎖,直到交易 1 遞交為止。

交易 2 繼續進行,而沒有任何封鎖。

交易閒置

UPDATE employee SET age=35 WHERE age=30;

COMMIT

交易閒置

交易 1 已成功遞交。

交易 1 會先遞交,並且能夠成功遞交。

交易閒置

COMMIT

交易 2 已成功遞交。

交易 2 遞交失敗並出現序列化錯誤,整個交易已復原。重試交易 2。

SELECT * FROM employee;

交易閒置

兩個交易的變更都會顯示。

交易 2 已復原。只會看到交易 1 變更。

在 Babelfish 中,只有當所有並行交易都在隔離層級執行時,序列化異常才可能SERIALIZABLE。在下表中,讓我們採取上述範例,但REPEATABLE READ將交易 2 改為隔離層級。

交易 1 交易 2 SQL 伺服器隔離層級 Babelfish 隔離層級

BEGIN TRANSACTION

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL SERILAIZABLE;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT * FROM employee;

交易閒置

UPDATE employee SET age=5 WHERE age=10;

交易閒置

交易閒置

SELECT * FROM employee;

交易 2 會遭到封鎖,直到交易 1 遞交為止。

交易 2 繼續進行,而沒有任何封鎖。

交易閒置

UPDATE employee SET age=35 WHERE age=30;

COMMIT

交易閒置

交易 1 已成功遞交。

交易 1 已成功遞交。

交易閒置

COMMIT

交易 2 已成功遞交。

交易 2 已成功遞交。

SELECT * FROM employee;

交易閒置

兩個交易的變更都會顯示。

兩個交易的變更都會顯示。