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