本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
比較 Babelfish 和SQL伺服器隔離層級
以下是 SQL Server 和 Babelfish 如何實作ANSI隔離層級的細微差異範例。
注意
Babelfish 中的隔離層級
REPEATABLE READ
和SNAPSHOT
相同。Babelfish 中的隔離層級
READ UNCOMMITTED
和READ 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 |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
交易閒置 |
|
更新成功。 |
更新成功。 |
交易閒置 |
|
插入成功。 |
插入成功。 |
|
交易閒置 |
交易 1 可以看到交易 2 的未遞交變更。 |
與 Babelfish |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
查看交易 2 所做的變更。 |
查看交易 2 所做的變更。 |
Babelfish 與SQL伺服器READ COMMITTED
隔離層級READ COMMITTED
的比較
下表提供執行並行交易時讀取寫入封鎖行為的詳細資訊。與 Babelfish 實作相比,它顯示使用SQL伺服器中的READ COMMITTED
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 READ COMMITTED |
Babelfish READ COMMITTED |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
更新成功。 |
更新成功。 |
|
交易閒置 |
步驟被封鎖,直到交易 2 遞交為止。 |
交易 2 變更尚未顯示。更新 id=3 的資料列。 |
交易閒置 |
|
交易 2 已成功遞交。交易 1 現在已解除封鎖,並查看交易 2 的更新。 |
交易 2 已成功遞交。 |
|
交易閒置 |
交易 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 |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
步驟會遭到封鎖,直到交易 1 遞交為止。插入的資料列被交易 1 鎖定。 |
已更新三列。新插入的資料列尚未顯示。 |
|
交易閒置 |
遞交成功。交易 2 現在已解除封鎖。 |
遞交成功。 |
交易閒置 |
|
所有 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 |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
無 |
無 |
交易閒置 |
|
交易 2 會遭到封鎖,直到交易 1 遞交為止。 |
交易 2 會正常進行。 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 1 的更新可見。 |
交易 1 的更新不會顯示。 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
會看到交易 1 的更新。 |
會看到交易 1 的更新。 |
下表提供執行並行交易時寫入封鎖行為的詳細資訊。其顯示與 REPEATABLE READ
Babelfish 實作相比,在SQL伺服器中使用REPEATABLE READ
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 REPEATABLE READ |
Babelfish REPEATABLE READ |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 2 已封鎖。 |
交易 2 已封鎖。 |
|
交易閒置 |
遞交成功,交易 2 已解除封鎖。 |
遞交成功,交易 2 失敗,但由於並行更新,錯誤無法序列化存取。 |
交易閒置 |
|
遞交成功。 |
交易 2 已中止。 |
交易閒置 |
|
id=1 的資料列具有 name='A_TX2'。 |
id=1 的資料列的名稱為='A_TX1'。 |
下表提供在執行並行交易時,模擬讀取行為的詳細資訊。其顯示與 REPEATABLE READ
Babelfish 實作相比,在SQL伺服器中使用REPEATABLE READ
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 REPEATABLE READ |
Babelfish REPEATABLE READ |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 2 繼續進行,而不會有任何封鎖。 |
交易 2 繼續進行,而不會有任何封鎖。 |
交易閒置 |
|
可看見新插入的資料列。 |
可看見新插入的資料列。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 2 插入的新資料列會顯示。 |
交易 2 插入的新資料列不會顯示。 |
|
交易閒置 |
無 |
無 |
|
交易閒置 |
可看見新插入的資料列。 |
可看見新插入的資料列。 |
下表提供執行並行交易時的詳細資訊,以及與 REPEATABLE READ
Babelfish 實作相比,使用 SQL 伺服器中的REPEATABLE READ
隔離層級時不同的最終結果。
交易 1 | 交易 2 | SQL 伺服器 REPEATABLE READ |
Babelfish REPEATABLE READ |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
交易 1 會使用 ID 1 更新資料列。 |
交易 1 會使用 ID 1 更新資料列。 |
交易閒置 |
|
交易 2 會遭到封鎖,因為SELECT陳述式會嘗試讀取交易 1 中UPDATE查詢鎖定的資料列。 |
交易 2 不會進行任何封鎖,因為讀取永遠不會遭到封鎖、陳述SELECT式會執行,最後更新 ID = 3 的資料列,因為交易 1 變更尚未顯示。 |
交易閒置 |
|
此步驟會在交易 1 遞交後執行。ID = 1 的資料列會由前一個步驟的交易 2 更新,並在此處顯示。 |
ID = 3 的資料列會由交易 2 更新。 |
|
交易閒置 |
交易 2 現在已解除封鎖。 |
遞交成功。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
兩個交易都會在 ID = 1 的資料列上執行更新。 |
交易 1 和 2 會更新不同的資料列。 |
Babelfish 與SQL伺服器SERIALIZABLE
隔離層級SERIALIZABLE
的比較
下表提供執行並行交易時範圍鎖定的詳細資訊。與 SERIALIZABLE
Babelfish 實作相比,它顯示使用SQL伺服器中的SERIALIZABLE
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 SERIALIZABLE |
Babelfish SERIALIZABLE |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 2 會遭到封鎖,直到交易 1 遞交為止。 |
交易 2 繼續進行,而沒有任何封鎖。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 1 已成功遞交。交易 2 現在已解除封鎖。 |
交易 1 已成功遞交。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
可看見新插入的資料列。 |
可看見新插入的資料列。 |
下表提供執行並行交易時的詳細資訊,以及與 SERIALIZABLE
Babelfish 實作相比,使用 SQL 伺服器中的SERIALIZABLE
隔離層級時不同的最終結果。
交易 1 | 交易 2 | SQL 伺服器 SERIALIZABLE |
Babelfish SERIALIZABLE |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 1 會遭到封鎖,直到交易 2 遞交為止。 |
交易 1 會繼續進行,而不會有任何封鎖。 |
交易閒置 |
|
交易 2 已成功遞交。交易 1 現在已解除封鎖。 |
交易 2 已成功遞交。 |
|
交易閒置 |
無 |
無 |
|
交易閒置 |
顯示新插入的資料列,年齡值 = 99。 |
顯示新插入的資料列,年齡值 = 40。 |
當您INSERT
進入具有唯一限制條件的資料表時,下表會提供詳細資訊。其顯示與 SERIALIZABLE
Babelfish 實作相比,在SQL伺服器中使用SERIALIZABLE
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 SERIALIZABLE |
Babelfish SERIALIZABLE |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 1 會遭到封鎖,直到交易 2 遞交為止。 |
交易 1 會遭到封鎖,直到交易 2 遞交為止。 |
交易閒置 |
|
交易 2 已成功遞交。交易 1 現在已解除封鎖。 |
交易 2 已成功遞交。交易 1 因錯誤重複金鑰值而中止,違反了唯一的限制條件。 |
|
交易閒置 |
交易 1 已成功遞交。 |
交易 1 遞交失敗,由於交易之間的讀取或寫入相依性, 無法序列化存取。 |
|
交易閒置 |
資料列 (5、'E'、50) 已插入。 |
只有 4 個資料列存在。 |
在 Babelfish 中,若這些交易的執行與這些交易的所有可能序列 (一次一個) 執行不一致,則以可序列化層級可序列化方式執行的並行交易會失敗。
下表提供執行並行交易時序列化異常的詳細資訊。與 SERIALIZABLE
Babelfish 實作相比,它顯示使用SQL伺服器中的SERIALIZABLE
隔離層級時觀察到的結果。
交易 1 | 交易 2 | SQL 伺服器 SERIALIZABLE |
Babelfish SERIALIZABLE |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 2 會遭到封鎖,直到交易 1 遞交為止。 |
交易 2 繼續進行,而沒有任何封鎖。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 1 已成功遞交。 |
交易 1 會先遞交,並且能夠成功遞交。 |
交易閒置 |
|
交易 2 已成功遞交。 |
交易 2 遞交失敗並出現序列化錯誤,整個交易已復原。重試交易 2。 |
|
交易閒置 |
兩個交易的變更都會顯示。 |
交易 2 已復原。只會看到交易 1 變更。 |
在 Babelfish 中,只有當所有並行交易都在隔離層級執行時,序列化異常才可能SERIALIZABLE
。在下表中,讓我們採取上述範例,但REPEATABLE READ
將交易 2 改為隔離層級。
交易 1 | 交易 2 | SQL 伺服器隔離層級 | Babelfish 隔離層級 |
---|---|---|---|
|
|
無 |
無 |
|
|
無 |
無 |
|
交易閒置 |
無 |
無 |
|
交易閒置 |
無 |
無 |
交易閒置 |
|
交易 2 會遭到封鎖,直到交易 1 遞交為止。 |
交易 2 繼續進行,而沒有任何封鎖。 |
交易閒置 |
|
無 |
無 |
|
交易閒置 |
交易 1 已成功遞交。 |
交易 1 已成功遞交。 |
交易閒置 |
|
交易 2 已成功遞交。 |
交易 2 已成功遞交。 |
|
交易閒置 |
兩個交易的變更都會顯示。 |
兩個交易的變更都會顯示。 |