巴貝魚的事務隔離級別 - Amazon Aurora

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

巴貝魚的事務隔離級別

巴貝魚支持事務隔離級別READUNCOMMITTED和 READCOMMITTED. SNAPSHOT 從巴貝爾魚 3.4 版本開始額外的隔離級別,REPEATABLEREAD並SERIALIZABLE受到支持。巴貝爾魚中的所有隔離級別都支持 Postgre 中相應的隔離級別的行為。SQLSQL服務器和 Babelfish 使用不同的基礎機制來實現事務隔離級別(阻止並發訪問,事務持有的鎖,錯誤處理等)。而且,對於不同的工作負載,並行存取的運作方式也有一些細微的差異。如需有關此 Postgre SQL 行為的詳細資訊,請參閱交易隔離

交易隔離層次概觀

原始SQL伺服器交易隔離等級是以悲觀的鎖定為基礎,其中只有一個資料複本存在,而且查詢必須先鎖定資源 (例如資料列),才能存取這些資源。後來,引入了「讀取認可隔離等級」的變體。這可讓使用資料列版本,使用非封鎖存取,在讀取器和寫入器之間提供更佳的並行性。此外,也可使用稱為快照的新隔離層級。它也會使用資料列版本,藉由避免在保留到交易結束之前讀取資料的共用鎖定,藉此提供比REPEATABLEREAD隔離層級更好的並行性。

與SQL服務器不同,Babelfish 中的所有事務隔離級別都基於樂觀鎖定()MVCC。無論基礎資料的目前狀態為何,每個交易都會在陳述式 (READCOMMITTED) 開頭或交易開頭 (REPEATABLEREAD,SERIALIZABLE) 看到資料的快照集。因此,Babelfish 中並行交易的執行行為可能會與伺服器不同。SQL

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

SQL伺服器中的隔離等級 巴貝魚隔離等級 後SQL隔離等級 說明

READ UNCOMMITTED

READ UNCOMMITTED

READ UNCOMMITTED

讀取未提交相同於在嬰兒魚/Postgre 中讀取提交 SQL

READ COMMITTED

READ COMMITTED

READ COMMITTED

SQL服務器讀取提交是基於悲觀的鎖定,Babelfish 讀取提交是基於快照()。MVCC

READ COMMITTED SNAPSHOT

READ COMMITTED

READ COMMITTED

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

SNAPSHOT

SNAPSHOT

REPEATABLE READ

完全一樣

REPEATABLE READ

REPEATABLE READ

REPEATABLE READ

SQL服務器可重複讀取是基於悲觀的鎖定,Babelfish 可重複讀取是基於快照()。MVCC

SERIALIZABLE

SERIALIZABLE

SERIALIZABLE

SQL服務器序列化是悲觀的隔離,Babelfish 序列化是基於快照()。MVCC

注意

目前不支援資料表提示,且其行為是透過使用 Babelfish 預先定義的逸出剖面線來控制。escape_hatch_table_hints

設定交易隔離層級

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

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

啟用或停用交易隔離層級

事務隔離級別 REPEATABLEREAD,SERIALIZABLE默認情況下在 Babelfish 中禁用,您必須通過將babelfishpg_tsql.isolation_level_serializablebabelfishpg_tsql.isolation_level_repeatable_read轉義填充設置為使用來pg_isolation明確啟用它們。sp_babelfish_configure如需詳細資訊,請參閱使用逃生艙管理 Babelfish 錯誤處理

以下是透過設定各自的逸出剖面線來啟用或停用目前作業階段SERIALIZABLE中的REPEATABLEREAD和使用的範例。選擇性地包含server參數,以設定目前作業階段以及所有後續新工作階段的逸出剖面線。

若要啟用僅SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD在目前工作階段中使用。

EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'

啟用SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD在目前工作階段和所有後續的新工作階段中使用。

EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'

若要停用SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD在目前工作階段和隨後的新工作階段中使用。

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'