本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Babelfish 中的交易隔離層級
Babelfish 支援交易隔離層級 READ UNCOMMITTED、READ COMMITTED 和 SNAPSHOT。從 Babelfish 3.4 版開始,支援其他隔離層級 REPEATABLE READ 和 SERIALIZABLE。Babelfish 中的所有隔離層級都受 PostgreSQL 中對應隔離層級的行為支援。SQL Server 和 Babelfish 使用不同的基礎機制來實作交易隔離層級 (封鎖並行存取、交易保留的鎖定、錯誤處理等)。此外,並行存取可能適用於不同工作負載的方式有一些細微差異。如需此 PostgreSQL 行為的詳細資訊,請參閱交易隔離
交易隔離層級概觀
原始 SQL Server 交易隔離層級是根據悲觀鎖定,其中只有一個資料複本存在,而查詢必須在存取列之類的資源之前將其鎖定。稍後,推出了 READ COMMITTED 隔離層級的變化。這使得能夠使用列版本透過非封鎖存取,在讀取器和寫入器之間提供更好的並行。此外,也可以使用名為 SNAPSHOT 的新隔離層級。其還使用列版本來提供比 REPEATABLE READ 隔離層級更好的並行,方法是避免在讀取資料時保留直至交易結束前的共用鎖定。
與 SQL Server 不同,Babelfish 中的所有交易隔離層級都是以樂觀鎖定 (MVCC) 為基礎。無論基礎資料的目前狀態為何,每個交易都會在陳述式 (READ COMMITTED) 開頭或交易 (REPEATABLE READ、SERIALIZABLE) 開頭看到資料的快照。因此,Babelfish 中並行交易的執行行為可能與 SQL Server 不同。
例如,假設具有隔離層級 SERIALIZABLE 的交易最初在 SQL Server 中遭到封鎖,但稍後成功。由於序列化與讀取或更新相同列的並行交易發生衝突,最終可能會在 Babelfish 中失敗。在某些情況下,與 SQL Server 相比,執行多個並行交易會在 Babelfish 中產生不同的最終結果。使用隔離層級的應用程式,應針對並行案例進行徹底測試。
| SQL Server 中的隔離層級 | Babelfish 隔離層級 | PostgreSQL 隔離層級 | 說明 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
SQL Server |
|
|
|
|
兩者都是以快照 (MVCC) 為基礎,但不完全相同。 |
|
|
|
|
完全相同。 |
|
|
|
|
SQL Server |
|
|
|
|
SQL Server |
注意
資料表提示目前不受支援,其行為是透過使用 Babelfish 預先定義的逃生艙 escape_hatch_table_hints 來控制。
設定交易隔離層級
使用下列命令來設定交易隔離層級:
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
啟用或停用交易隔離層級
Babelfish 預設會停用交易隔離層級 REPEATABLE READ 和 SERIALIZABLE,您必須使用 sp_babelfish_configure,將 babelfishpg_tsql.isolation_level_serializable 或 babelfishpg_tsql.isolation_level_repeatable_read 逃生艙設為 pg_isolation 以明確將其啟用。如需更多詳細資訊,請參閱 使用逃生艙管理 Babelfish 錯誤處理。
以下範例示範如何透過設定各自的逃生艙,啟用或停用目前工作階段中 REPEATABLE READ 和 SERIALIZABLE 的使用。選擇性地包含 server 參數,以設定目前工作階段以及所有後續新工作階段的逃生艙。
僅在目前工作階段中啟用 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'
在目前工作階段和所有後續新工作階段中啟用 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'
若要停用目前工作階段和後續新工作階段中 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'
僅在目前工作階段中啟用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'
在目前工作階段和所有後續新工作階段中啟用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'
若要停用目前工作階段和後續新工作階段中 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 的使用。
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'