Comecei a solucionar um tempdb
problema que estamos tendo no SQL Server 2005 Enterprise Edition. Um desenvolvedor está recebendo um erro tempdb
de falta de espaço. Tecnicamente, o erro é:
A transação foi interrompida ao acessar a linha com versão na tabela 'dbo.inserted' no banco de dados 'dbname'. A linha com versão solicitada não foi encontrada. Seu tempdb provavelmente está sem espaço. Consulte BOL sobre como configurar o tempdb para controle de versão
Eu olhei para a configuração do banco de dados sys.databases
e encontrei as seguintes configurações:
snapshot_isolation_state: 0
snapshot_isolation_state_desc: OFF
is_read_committed_snapshot_on: 1
Pesquisei o que isso significava no BOL e as informações importantes são as seguintes:
snapshot_isolation_state
Estado das transações de isolamento de instantâneo permitidas, conforme definido pela opção ALLOW_SNAPSHOT_ISOLATION:
0 = O estado de isolamento do instantâneo está DESLIGADO (padrão). O isolamento de instantâneo não é permitido.
1 = Estado de isolamento de instantâneo LIGADO. O isolamento de instantâneo é permitido.
2 = O estado de isolamento do instantâneo está em transição para o estado DESLIGADO. Todas as transações têm suas modificações versionadas. Não é possível iniciar novas transações usando isolamento de instantâneo. O banco de dados permanece na transição para o estado OFF até que todas as transações que estavam ativas quando ALTER DATABASE foi executado possam ser concluídas.
3 = O estado de isolamento do instantâneo está em transição para o estado ON. Novas transações têm suas modificações versionadas. As transações não podem usar isolamento de instantâneo até que o estado de isolamento de instantâneo se torne 1 (ON). O banco de dados permanece na transição para o estado ON até que todas as transações de atualização que estavam ativas quando ALTER DATABASE foi executado possam ser concluídas.
snapshot_isolation_state_desc
Descrição do estado das transações de isolamento de instantâneo permitidas, conforme definido pela opção ALLOW_SNAPSHOT_ISOLATION:
- DESLIGADO
- SOBRE
- IN_TRANSITION_TO_ON
- IN_TRANSITION_TO_OFF
is_read_committed_snapshot_on
1 = A opção READ_COMMITTED_SNAPSHOT está ATIVADA. As operações de leitura no nível de isolamento de confirmação de leitura são baseadas em varreduras de instantâneo e não adquirem bloqueios.
0 = a opção READ_COMMITTED_SNAPSHOT está DESLIGADA (padrão). As operações de leitura no nível de isolamento de confirmação de leitura usam bloqueios de compartilhamento.
Se estou entendendo isso corretamente, snapshot_isolation_state
está DESLIGADO e não permitido. No entanto, o 1 is_read_committed_snapshot_on
indica que o banco de dados está usando isolamento de instantâneo. Como isso é possível se é proibido?
Como observou @AlexKuznetsov,
SNAPSHOT
existemREAD_COMMITTED_SNAPSHOT
dois níveis de isolamento diferentes. Como tal,snapshot_isolation_state
indica o primeiro, enquantois_read_committed_snapshot_on
o último. Aqui estão alguns comentários que encontrei que resumem as diferenças entre os dois:e ...