

# Níveis de isolamento de transações no Babelfish
<a name="babelfish-transaction"></a>

O Babelfish aceita os níveis de isolamento de transações `READ UNCOMMITTED`, `READ COMMITTED` e `SNAPSHOT`. A partir da versão 3.4 do Babelfish, os níveis de isolamento adicionais `REPEATABLE READ` e `SERIALIZABLE` são aceitos. Todos os níveis de isolamento no Babelfish são aceitos com o comportamento dos níveis de isolamento correspondentes no PostgreSQL. O SQL Server e o Babelfish usam mecanismos subjacentes diferentes para implementar níveis de isolamento de transações (bloqueio de acesso simultâneo, bloqueios mantidos por transações, tratamento de erros etc.). E há algumas diferenças sutis na forma como o acesso simultâneo pode funcionar para diferentes workloads. Para ter mais informações sobre esse comportamento do PostgreSQL, consulte [Transaction Isolation](https://www.postgresql.org/docs/current/transaction-iso.html). 

**Topics**
+ [Visão geral dos níveis de isolamento de transações](#babelfish-transaction.overview)
+ [Configurar os níveis de isolamento de transações](#babelfish-transaction.setting)
+ [Habilitar ou desabilitar os níveis de isolamento de transações](#babelfish-transaction.enabling)
+ [Comparar os níveis de isolamento do Babelfish e do SQL Server](babelfish-transaction.examples.md)

## Visão geral dos níveis de isolamento de transações
<a name="babelfish-transaction.overview"></a>

 Os níveis originais de isolamento de transações do SQL Server são baseados no bloqueio pessimista, em que existe apenas uma cópia dos dados e as consultas devem bloquear recursos, como linhas, antes de acessá-los. Posteriormente, foi introduzida uma variação do nível de isolamento `READ COMMITTED`. Isso permite o uso de versões em linha para oferecer melhor simultaneidade entre leitores e gravadores usando acesso sem bloqueio. Além disso, um novo nível de isolamento chamado `SNAPSHOT` está disponível. Ele também usa versões de linha para oferecer melhor simultaneidade do que o nível de isolamento `REPEATABLE READ`, evitando bloqueios compartilhados nos dados de leitura que são mantidos até o final da transação.

Ao contrário do SQL Server, todos os níveis de isolamento de transações no Babelfish são baseados no bloqueio positivo (MVCC). Cada transação vê um snapshot dos dados no início da instrução (`READ COMMITTED`) ou no início da transação (`REPEATABLE READ`, `SERIALIZABLE`), independentemente do estado atual dos dados subjacentes. Portanto, o comportamento de execução de transações simultâneas no Babelfish pode ser diferente do comportamento no SQL Server.

Por exemplo, pense em uma transação com nível de isolamento `SERIALIZABLE` que inicialmente seja bloqueada no SQL Server, mas seja bem-sucedida posteriormente. Ela pode acabar falhando no Babelfish devido a um conflito de serialização com uma transação simultânea que lê ou atualiza as mesmas linhas. Também pode haver casos em que a execução de várias transações simultâneas produza um resultado final diferente no Babelfish em comparação ao SQL Server. As aplicações que usam níveis de isolamento devem ser testadas de maneira completa para cenários de concorrência. 


| Níveis de isolamento no SQL Server | Nível de isolamento do Babelfish | Nível de isolamento do PostgreSQL | Comentários | 
| --- | --- | --- | --- | 
| `READ UNCOMMITTED` | `READ UNCOMMITTED` | `READ UNCOMMITTED` | `READ UNCOMMITTED` é o mesmo que `READ COMMITTED` no Babelfish ou no PostgreSQL | 
| `READ COMMITTED` | `READ COMMITTED` | `READ COMMITTED` | O `READ COMMITTED` do SQL Server se baseia em bloqueio pessimista, enquanto o `READ COMMITTED` do Babelfish é baseado em snapshots (MVCC). | 
| `READ COMMITTED SNAPSHOT` | `READ COMMITTED` | `READ COMMITTED` | Ambos se baseiam em snapshots (MVCC), mas não são exatamente iguais. | 
| `SNAPSHOT` | `SNAPSHOT` | `REPEATABLE READ` | Exatamente o mesmo. | 
| `REPEATABLE READ` | `REPEATABLE READ` | `REPEATABLE READ` | O `REPEATABLE READ` do SQL Server se baseia em bloqueio pessimista, enquanto o `REPEATABLE READ` do Babelfish é baseado em snapshots (MVCC). | 
| `SERIALIZABLE` | `SERIALIZABLE` | `SERIALIZABLE` | O `SERIALIZABLE` do SQL Server é um isolamento pessimista, enquanto o `SERIALIZABLE` do Babelfish é baseado em snapshots (MVCC). | 

**nota**  
As dicas da tabela não são aceitas atualmente e o comportamento é controlado com o uso do hatch de escape predefinido do Babelfish `escape_hatch_table_hints`.

## Configurar os níveis de isolamento de transações
<a name="babelfish-transaction.setting"></a>

Use o seguinte comando para definir o nível de isolamento de transações:

**Example**  

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

## Habilitar ou desabilitar os níveis de isolamento de transações
<a name="babelfish-transaction.enabling"></a>

Os níveis de isolamento de transações `REPEATABLE READ` e `SERIALIZABLE` estão desabilitados por padrão no Babelfish, sendo necessário habilitá-los explicitamente definindo o hatch de escape `babelfishpg_tsql.isolation_level_serializable` ou `babelfishpg_tsql.isolation_level_repeatable_read` como `pg_isolation` usando `sp_babelfish_configure`. Para ter mais informações, consulte [Gerenciar o tratamento de erros do Babelfish com hatches de escape](babelfish-strict.md).

Veja exemplos para habilitar ou desabilitar o uso de `REPEATABLE READ` e `SERIALIZABLE` na sessão atual definindo seus respectivos hatches de escape. Opcionalmente, inclua um parâmetro `server` para definir o hatch de escape para a sessão atual, bem como para todas as novas sessões subsequentes.

 Para habilitar o uso de `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` somente na sessão atual: 

**Example**  

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

 Para habilitar o uso de `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` na sessão atual e em todas as novas sessões subsequentes: 

**Example**  

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

 Para desabilitar o uso de `SET TRANSACTION ISOLATION LEVEL REPEATABLE READ` na sessão atual e nas novas sessões subsequentes: 

**Example**  

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

 Para habilitar o uso de `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` somente na sessão atual: 

**Example**  

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

 Para habilitar o uso de `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` na sessão atual e em todas as novas sessões subsequentes: 

**Example**  

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

 Para desabilitar o uso de `SET TRANSACTION ISOLATION LEVEL SERIALIZABLE` na sessão atual e nas novas sessões subsequentes: 

**Example**  

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