

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

# Babelfish 中的交易隔離層級
<a name="babelfish-transaction"></a>

Babelfish 支援交易隔離層級 `READ UNCOMMITTED`、`READ COMMITTED` 和 `SNAPSHOT`。從 Babelfish 3.4 版開始，支援其他隔離層級 `REPEATABLE READ` 和 `SERIALIZABLE`。Babelfish 中的所有隔離層級都受 PostgreSQL 中對應隔離層級的行為支援。SQL Server 和 Babelfish 使用不同的基礎機制來實作交易隔離層級 (封鎖並行存取、交易保留的鎖定、錯誤處理等)。此外，並行存取可能適用於不同工作負載的方式有一些細微差異。如需此 PostgreSQL 行為的詳細資訊，請參閱[交易隔離](https://www.postgresql.org/docs/current/transaction-iso.html)。

**Topics**
+ [交易隔離層級概觀](#babelfish-transaction.overview)
+ [設定交易隔離層級](#babelfish-transaction.setting)
+ [啟用或停用交易隔離層級](#babelfish-transaction.enabling)
+ [比較 Babelfish 和 SQL Server 隔離層級](babelfish-transaction.examples.md)

## 交易隔離層級概觀
<a name="babelfish-transaction.overview"></a>

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

與 SQL Server 不同，Babelfish 中的所有交易隔離層級都是以樂觀鎖定 (MVCC) 為基礎。無論基礎資料的目前狀態為何，每個交易都會在陳述式 (`READ COMMITTED`) 開頭或交易 (`REPEATABLE READ`、`SERIALIZABLE`) 開頭看到資料的快照。因此，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` 來控制。

## 設定交易隔離層級
<a name="babelfish-transaction.setting"></a>

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

**Example**  

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

## 啟用或停用交易隔離層級
<a name="babelfish-transaction.enabling"></a>

Babelfish 預設會停用交易隔離層級 `REPEATABLE READ` 和 `SERIALIZABLE`，您必須使用 `sp_babelfish_configure`，將 `babelfishpg_tsql.isolation_level_serializable` 或 `babelfishpg_tsql.isolation_level_repeatable_read` 逃生艙設為 `pg_isolation` 以明確將其啟用。如需更多詳細資訊，請參閱 [使用逃生艙管理 Babelfish 錯誤處理](babelfish-strict.md)。

以下範例示範如何透過設定各自的逃生艙，啟用或停用目前工作階段中 `REPEATABLE READ` 和 `SERIALIZABLE` 的使用。選擇性地包含 `server` 參數，以設定目前工作階段以及所有後續新工作階段的逃生艙。

 僅在目前工作階段中啟用 `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` 的使用。

**Example**  

```
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'
```

 在目前工作階段和所有後續新工作階段中啟用 `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` 的使用。

**Example**  

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

 若要停用目前工作階段和後續新工作階段中 `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` 的使用。

**Example**  

```
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'
```

 僅在目前工作階段中啟用 `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` 的使用。

**Example**  

```
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'
```

 在目前工作階段和所有後續新工作階段中啟用 `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` 的使用。

**Example**  

```
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'
```

 若要停用目前工作階段和後續新工作階段中 `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` 的使用。

**Example**  

```
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'
```