Babelfish 中的交易隔離層級 - Amazon Aurora

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

Babelfish 中的交易隔離層級

Babelfish 支援交易隔離層級 READ UNCOMMITTEDREAD COMMITTEDSNAPSHOT。從 Babelfish 3.4 版開始,支援其他隔離層級 REPEATABLE READSERIALIZABLE。Babelfish 中的所有隔離層級都受 PostgreSQL 中對應隔離層級的行為支援。SQL Server 和 Babelfish 使用不同的基礎機制來實作交易隔離層級 (封鎖並行存取、交易保留的鎖定、錯誤處理等)。此外,並行存取可能適用於不同工作負載的方式有一些細微差異。如需此 PostgreSQL 行為的詳細資訊,請參閱交易隔離

交易隔離層級概觀

原始 SQL Server 交易隔離層級是根據悲觀鎖定,其中只有一個資料複本存在,而查詢必須在存取列之類的資源之前將其鎖定。稍後,推出了 READ COMMITTED 隔離層級的變化。這使得能夠使用列版本透過非封鎖存取,在讀取器和寫入器之間提供更好的並行。此外,也可以使用名為 SNAPSHOT 的新隔離層級。其還使用列版本來提供比 REPEATABLE READ 隔離層級更好的並行,方法是避免在讀取資料時保留直至交易結束前的共用鎖定。

與 SQL Server 不同,Babelfish 中的所有交易隔離層級都是以樂觀鎖定 (MVCC) 為基礎。無論基礎資料的目前狀態為何,每個交易都會在陳述式 (READ COMMITTED) 開頭或交易 (REPEATABLE READSERIALIZABLE) 開頭看到資料的快照。因此,Babelfish 中並行交易的執行行為可能與 SQL Server 不同。

例如,假設具有隔離層級 SERIALIZABLE 的交易最初在 SQL Server 中遭到封鎖,但稍後成功。由於序列化與讀取或更新相同列的並行交易發生衝突,最終可能會在 Babelfish 中失敗。在某些情況下,與 SQL Server 相比,執行多個並行交易會在 Babelfish 中產生不同的最終結果。使用隔離層級的應用程式,應針對並行案例進行徹底測試。

SQL Server 中的隔離層級 Babelfish 隔離層級 PostgreSQL 隔離層級 說明

READ UNCOMMITTED

READ UNCOMMITTED

READ UNCOMMITTED

READ UNCOMMITTED 與 Babelfish 或 PostgreSQL 中的 READ COMMITTED 相同

READ COMMITTED

READ COMMITTED

READ COMMITTED

SQL Server READ COMMITTED 以悲觀鎖定為基礎,而 Babelfish READ COMMITTED 則以快照 (MVCC) 為基礎。

READ COMMITTED SNAPSHOT

READ COMMITTED

READ COMMITTED

兩者都是以快照 (MVCC) 為基礎,但不完全相同。

SNAPSHOT

SNAPSHOT

REPEATABLE READ

完全相同。

REPEATABLE READ

REPEATABLE READ

REPEATABLE READ

SQL Server REPEATABLE READ 以悲觀鎖定為基礎,而 Babelfish REPEATABLE READ 則以快照 (MVCC) 為基礎。

SERIALIZABLE

SERIALIZABLE

SERIALIZABLE

SQL Server SERIALIZABLE 是悲觀隔離,而 Babelfish SERIALIZABLE 是以快照 (MVCC) 為基礎。

注意

資料表提示目前不受支援,其行為是透過使用 Babelfish 預先定義的逃生艙 escape_hatch_table_hints 來控制。

設定交易隔離層級

使用下列命令來設定交易隔離層級:

SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }

啟用或停用交易隔離層級

Babelfish 預設會停用交易隔離層級 REPEATABLE READSERIALIZABLE,您必須使用 sp_babelfish_configure,將 babelfishpg_tsql.isolation_level_serializablebabelfishpg_tsql.isolation_level_repeatable_read 逃生艙設為 pg_isolation 以明確將其啟用。如需更多詳細資訊,請參閱 使用逃生艙管理 Babelfish 錯誤處理

以下範例示範如何透過設定各自的逃生艙,啟用或停用目前工作階段中 REPEATABLE READSERIALIZABLE 的使用。選擇性地包含 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'