Níveis de isolamento de transações no Babelfish - Amazon Aurora

Níveis de isolamento de transações no Babelfish

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.

Visão geral dos níveis de isolamento de transações

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

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

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

Habilitar ou desabilitar os níveis de isolamento de transações

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.

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:

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:

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:

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:

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:

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:

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