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

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

Babelfish 中的交易隔離層級

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

交易隔離層級概觀

原始SQL伺服器交易隔離層級是根據預估鎖定,其中只有一份資料複本存在,而查詢必須在存取資料列之前鎖定資料列等資源。稍後,引入了READ COMMITTED隔離層級的變化。這可讓 列版本使用非封鎖存取,在讀取器和寫入器之間提供更好的並行。此外,SNAPSHOT也有名為 的新隔離層級可用。它也會使用資料列版本,藉由避免在交易結束之前保留讀取資料的共用鎖定,以提供比REPEATABLE READ隔離層級更好的並行。

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

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

SQL 伺服器中的隔離層級 Babelfish 隔離層級 PostgreSQL 隔離層級 說明

READ UNCOMMITTED

READ UNCOMMITTED

READ UNCOMMITTED

READ UNCOMMITTED 與 Babelfish 或 Postgre READ COMMITTED中的 相同SQL

READ COMMITTED

READ COMMITTED

READ COMMITTED

SQL 伺服器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 伺服器REPEATABLE READ以輕率鎖定為基礎,Babelfish REPEATABLE READ 以快照 (MVCC) 為基礎。

SERIALIZABLE

SERIALIZABLE

SERIALIZABLE

SQL 伺服器SERIALIZABLE是樂觀隔離,Babelfish SERIALIZABLE是快照 (MVCC)。

注意

資料表提示目前不受支援,其行為是透過使用 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_serializablebabelfishpg_tsql.isolation_level_repeatable_read逸出雜湊設定為 ,以明確啟用這些層級sp_babelfish_configure。如需詳細資訊,請參閱使用逃生艙管理 Babelfish 錯誤處理

以下是透過設定各自的逃生艙來啟用或停用目前工作階段SERIALIZABLEREPEATABLE 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'