

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Transaktionsisolationsstufen in Babelfish
<a name="babelfish-transaction"></a>

Babelfish unterstützt die Transaktionsisolationsstufen `READ UNCOMMITTED`, `READ COMMITTED` und `SNAPSHOT`. Ab der Babelfish-Version 3.4 werden die zusätzlichen Isolationsstufen `REPEATABLE READ` und `SERIALIZABLE` unterstützt. Alle Isolationsstufen in Babelfish werden mit dem Verhalten der entsprechenden Isolationsstufen in PostgreSQL unterstützt. SQL Server und Babelfish verwenden unterschiedliche grundlegende Mechanismen zur Implementierung von Isolationsstufen für Transaktionen (Blockierung für gleichzeitigen Zugriff, Sperren aufgrund von Transaktionen, Fehlerbehandlung usw.). Und es gibt einige subtile Unterschiede darin, wie sich der gleichzeitige Zugriff für unterschiedliche Workloads auswirken kann. Weitere Informationen zu diesem PostgreSQL-Verhalten finden Sie unter [Transaktionsisolation](https://www.postgresql.org/docs/current/transaction-iso.html). 

**Topics**
+ [Übersicht über die Transaktionsisolationsstufen](#babelfish-transaction.overview)
+ [Einrichten der Transaktionsisolationsstufen](#babelfish-transaction.setting)
+ [Aktivieren oder Deaktivieren von Transaktionsisolationsstufen](#babelfish-transaction.enabling)
+ [Vergleich der Isolationsstufen in Babelfish und SQL Server](babelfish-transaction.examples.md)

## Übersicht über die Transaktionsisolationsstufen
<a name="babelfish-transaction.overview"></a>

 Die ursprünglichen SQL-Server-Transaktionsisolationsstufen basieren auf pessimistischen Sperren, bei denen nur eine Kopie der Daten vorhanden ist und Abfragen Ressourcen wie Zeilen sperren müssen, bevor auf sie zugegriffen werden kann. Später wurde eine Variante der Isolationsstufe `READ COMMITTED` eingeführt. Dies ermöglicht die Verwendung von Zeilenversionen, um eine bessere Parallelität zwischen Lesern und Schreibern zu gewährleisten, indem der Zugriff nicht blockiert wird. Darüber hinaus ist eine neue Isolationsstufe namens `SNAPSHOT` verfügbar. Außerdem werden Zeilenversionen verwendet, um eine bessere Parallelität als die Isolationsstufe `REPEATABLE READ` zu gewährleisten, indem gemeinsame Sperren für gelesene Daten vermieden werden, die bis zum Ende der Transaktion aufbewahrt werden.

Im Gegensatz zu SQL Server basieren alle Transaktionsisolationsstufen in Babelfish auf optimistischen Sperren (MVCC). Jede Transaktion sieht einen Snapshot der Daten entweder zu Beginn der Anweisung (`READ COMMITTED`) oder zu Beginn der Transaktion (`REPEATABLE READ`, `SERIALIZABLE`), unabhängig vom aktuellen Status der zugrunde liegenden Daten. Daher kann sich das Ausführungsverhalten gleichzeitiger Transaktionen in Babelfish von dem in SQL Server unterscheiden.

Stellen Sie sich zum Beispiel eine Transaktion mit der Isolationsstufe `SERIALIZABLE` vor, die zunächst in SQL Server blockiert wird, aber später erfolgreich ist. Sie kann in Babelfish aufgrund eines Serialisierungskonflikts mit einer gleichzeitigen Transaktion, die dieselben Zeilen liest oder aktualisiert, fehlschlagen. Es kann auch Fälle geben, in denen die Ausführung mehrerer gleichzeitiger Transaktionen in Babelfish zu einem anderen Endergebnis führt als in SQL Server. Anwendungen, die Isolationsstufen verwenden, sollten gründlich auf Parallelitätsszenarien getestet werden. 


| Isolationsstufen in SQL Server | Babelfish-Isolationsstufe | PostgreSQL-Isolationsstufe | Kommentare | 
| --- | --- | --- | --- | 
| `READ UNCOMMITTED` | `READ UNCOMMITTED` | `READ UNCOMMITTED` | `READ UNCOMMITTED` ist in Babelfish oder PostgreSQL dasselbe wie `READ COMMITTED`. | 
| `READ COMMITTED` | `READ COMMITTED` | `READ COMMITTED` | SQL Server `READ COMMITTED` basiert auf pessimistischen Sperren, Babelfish `READ COMMITTED` basiert auf Snapshots (MVCC). | 
| `READ COMMITTED SNAPSHOT` | `READ COMMITTED` | `READ COMMITTED` | Beide basieren auf Snapshots (MVCC), sind aber nicht exakt identisch. | 
| `SNAPSHOT` | `SNAPSHOT` | `REPEATABLE READ` | Genau dasselbe | 
| `REPEATABLE READ` | `REPEATABLE READ` | `REPEATABLE READ` | SQL Server `REPEATABLE READ` basiert auf pessimistischen Sperren, Babelfish `REPEATABLE READ` basiert auf Snapshots (MVCC). | 
| `SERIALIZABLE` | `SERIALIZABLE` | `SERIALIZABLE` | SQL Server `SERIALIZABLE` basiert auf pessimistischen Isolationen, Babelfish `SERIALIZABLE` basiert auf Snapshots (MVCC). | 

**Anmerkung**  
Die Tabellenhinweise werden derzeit nicht unterstützt und ihr Verhalten wird mithilfe der vordefinierten Notfalloption `escape_hatch_table_hints` von Babelfish gesteuert.

## Einrichten der Transaktionsisolationsstufen
<a name="babelfish-transaction.setting"></a>

Verwenden Sie den folgenden Befehl, um eine Transaktionsisolationsstufe festzulegen:

**Example**  

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

## Aktivieren oder Deaktivieren von Transaktionsisolationsstufen
<a name="babelfish-transaction.enabling"></a>

Die Transaktionsisolationsstufen `REPEATABLE READ` und `SERIALIZABLE` sind in Babelfish standardmäßig deaktiviert und Sie müssen sie explizit aktivieren, indem Sie die Notfalloption `babelfishpg_tsql.isolation_level_serializable` oder `babelfishpg_tsql.isolation_level_repeatable_read` mithilfe von `sp_babelfish_configure` auf `pg_isolation` setzen. Weitere Informationen finden Sie unter [Verwalten der Babelfish-Fehlerbehandlung mit Escape-Schraffuren](babelfish-strict.md).

Im Folgenden finden Sie Beispiele, wie Sie die Verwendung von `REPEATABLE READ` und `SERIALIZABLE` in der aktuellen Sitzung aktivieren oder deaktivieren können, indem Sie die entsprechenden Notfalloptionen setzen. Fügen Sie optional den Parameter `server` hinzu, um die Notfalloption für die aktuelle Sitzung sowie für alle nachfolgenden neuen Sitzungen festzulegen.

 Zum Aktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` nur in der aktuellen Sitzung 

**Example**  

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

 Zum Aktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` in der aktuellen Sitzung und allen nachfolgenden neuen Sitzungen 

**Example**  

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

 Zum Deaktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` in der aktuellen Sitzung und nachfolgenden neuen Sitzungen 

**Example**  

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

 Zum Aktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` nur in der aktuellen Sitzung 

**Example**  

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

 Zum Aktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` in der aktuellen Sitzung und allen nachfolgenden neuen Sitzungen 

**Example**  

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

 Zum Deaktivieren der Verwendung von `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` in der aktuellen Sitzung und nachfolgenden neuen Sitzungen 

**Example**  

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