Compartilhar via


Níveis de isolamento de transação em tabelas com otimização de memória

Os níveis de isolamento a seguir têm suporte para transações que acessam tabelas com otimização de memória.

  • INSTANTÂNEO

  • LEITURA REPETÍVEL

  • SERIALIZÁVEL

  • LEITURA CONFIRMADA

O nível de isolamento da transação pode ser especificado como parte do bloco atômico de um procedimento armazenado compilado nativamente. Para obter mais informações, veja CREATE PROCEDURE (Transact-SQL). Ao acessar tabelas otimizadas para memória a partir do Transact-SQL interpretado, o nível de isolamento pode ser especificado usando sugestões no nível da tabela.

Você deve especificar o nível de isolamento da transação ao definir um procedimento armazenado compilado nativamente. Você deve especificar o nível de isolamento nas sugestões de tabela ao acessar tabelas otimizadas para memória em transações realizadas por usuários no Transact-SQL interpretado. Para obter mais informações, consulte Diretrizes para níveis de isolamento de transações com tabelas de Memory-Optimized.

O nível de isolamento READ COMMITTED tem suporte para tabelas com otimização de memória com transações de confirmação automática. READ COMMITTED não é válido para transações de usuário ou em um bloco atômico. READ COMMITTED não é compatível com transações de usuário, sejam elas explícitas ou implícitas. O nível de isolamento READ_COMMITTED_SNAPSHOT tem suporte para tabelas com otimização de memória com transações de confirmação automática e somente se a consulta não acessar tabelas baseadas em disco. Além disso, transações iniciadas utilizando código Transact-SQL interpretado com isolamento de SNAPSHOT não podem acessar tabelas otimizadas para memória. Transações que utilizam o interpretado Transact-SQL com isolamento REPEATABLE READ ou SERIALIZABLE devem acessar tabelas otimizadas para memória usando o isolamento SNAPSHOT. Para obter mais informações sobre esse cenário, consulte Transações entre contêineres.

READ COMMITTED é o nível de isolamento padrão no SQL Server. Quando o nível de isolamento da sessão é READ COMMITTED (ou inferior), você pode executar uma das seguintes ações:

  • Use explicitamente uma dica de nível de isolamento mais alto para acessar a tabela com otimização de memória (por exemplo, WITH (SNAPSHOT)).

  • Especifique a opção MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT set, que definirá o nível de isolamento para tabelas com otimização de memória como SNAPSHOT (como se você tivesse incluído dicas WITH(SNAPSHOT) para cada tabela com otimização de memória). Para obter mais informações sobre MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT, consulte ALTER DATABASE SET Options (Transact-SQL).

Como alternativa, se o nível de isolamento da sessão for READ COMMITTED, você poderá usar transações de confirmação automática.

As transações SNAPSHOT iniciadas em Transact-SQL interpretadas não podem acessar tabelas com otimização de memória.

Os níveis de isolamento de transação compatíveis com tabelas com otimização de memória fornecem as mesmas garantias lógicas que as tabelas baseadas em disco. O mecanismo usado para fornecer garantias de nível de isolamento é diferente.

Para tabelas baseadas em disco, a maioria das garantias de nível de isolamento são implementadas usando o bloqueio, o que impede conflitos por meio do bloqueio. Para tabelas com otimização de memória, as garantias são impostas usando um mecanismo de detecção de conflitos, o que evita a necessidade de realizar bloqueios. A exceção é o isolamento SNAPSHOT em tabelas baseadas em disco. Isso é implementado de forma semelhante ao isolamento SNAPSHOT em tabelas otimizadas para memória, usando um mecanismo de detecção de conflitos.

INSTANTÂNEO
Esse nível de isolamento especifica que os dados lidos por qualquer instrução em uma transação serão a versão transacionalmente consistente dos dados que existiam no início da transação. A transação só pode reconhecer modificações de dados que foram confirmadas antes do início da transação. As modificações de dados feitas por outras transações após o início da transação atual não são visíveis para instruções em execução na transação atual. As instruções em uma transação obtêm um instantâneo dos dados confirmados como eles existiam no início da transação.

As operações de gravação (atualizações, inserções e exclusões) são sempre totalmente isoladas de outras transações. Portanto, as operações de gravação em uma transação SNAPSHOT podem entrar em conflito com as operações de gravação de outras transações. Quando a transação atual tenta atualizar ou excluir uma linha que foi atualizada ou excluída por outra transação confirmada após o início da transação atual, a transação termina com a seguinte mensagem de erro.

Erro 41302. A transação atual tentou atualizar um registro na tabela X que foi atualizado desde que essa transação foi iniciada. A transação foi anulada.

Quando a transação atual tenta inserir uma linha com o mesmo valor de chave primária que uma linha que foi inserida por outra transação confirmada antes da transação atual, haverá uma falha ao confirmar com a seguinte mensagem de erro.

Erro 41325. A transação atual não foi confirmada devido a uma falha de validação serializável.

Se uma transação gravar em uma tabela que é removida antes da confirmação da transação, a transação terminará com a seguinte mensagem de erro:

Erro 41305. A transação atual não foi confirmada devido a uma falha de validação de leitura repetível.

LEITURA REPETÍVEL
Esse nível de isolamento inclui as garantias fornecidas pelo nível de isolamento SNAPSHOT. Além disso, REPEATABLE READ garante que, para qualquer linha lida pela transação, no momento em que a transação é confirmada, a linha não tenha sido alterada por nenhuma outra transação. Cada operação de leitura na transação é repetível até o final da transação.

Se a transação atual tiver lido qualquer linha que tenha sido atualizada por outra transação confirmada antes da transação atual, a confirmação falhará com a seguinte mensagem de erro.

Erro 41305. A transação atual não foi confirmada devido a uma falha de validação de leitura repetível.

SERIALIZÁVEL
Esse nível de isolamento inclui as garantias fornecidas por REPEATABLE READ. Nenhuma linha fantasma apareceu entre o instantâneo e o final da transação. As linhas fantasmas correspondem à condição de filtro de uma seleção, atualização ou exclusão.

A transação é executada como se não houvesse transações simultâneas. Todas as ações ocorrem virtualmente em um único ponto de serialização (tempo de confirmação).

Se qualquer uma dessas garantias for violada, a transação falhará ao tentar confirmar com a seguinte mensagem de erro.

Erro 41325. A transação atual não foi confirmada devido a uma falha de validação serializável.

Consulte Também

Noções básicas sobre transações em tabelas de Memory-Optimized
Diretrizes para níveis de isolamento de transação com tabelas de Memory-Optimized
Diretrizes para a lógica de repetição de transações em tabelas de Memory-Optimized