本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
巴貝魚的事務隔離級別
巴貝魚支持事務隔離級別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_serializable
或babelfishpg_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'