Transação incompleta pode mantenha grande número de bloqueios e causar bloqueio

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 295108
Sumário
Quando uma transação não é concluída porque uma consulta expira ou porque o lote é cancelado no meio de uma transação sem emitir uma instrução COMMIT ou ROLLBACK para concluir a transação, a transação é deixada aberta e continuam todos os bloqueios adquiridos durante essa transação a ser mantido. Transações subseqüentes executadas sob a mesma conexão são tratadas como transações aninhadas, para que todos os bloqueios adquiridos nessas transações concluídas não são liberados. Esse problema se repete todas as transações executadas da mesma conexão até que um ROLLBACK é executado. Como resultado, um grande número de bloqueios é mantido, os usuários são bloqueados e as transações são perdidos, que resulta em dados que seja diferentes da esperada.
Mais Informações
O exemplo a seguir ilustra como os bloqueios não são liberados como resultado de uma transação aberta incompleta:
  1. Abra o SQL Server Query Analyzer e execute o seguinte lote mas cancelar a transação antes que ela conclua:
    Begin TranUpdate authors set state = 'CA'waitfor delay "00:02:00" --Cancel the commandCommit Tran					
  2. Exibir os bloqueios mantidas pelo executando o seguinte comando:
    sp_lock					
    você verá que os bloqueios são mantidos para a tabela autores .

  3. Da mesmo processo de identificação do servidor (SPID), executar o próximo lote:
    Begin TranUpdate titleauthor set au_ord = 0Commit Tran - Completed transaction.					
  4. Exibir os bloqueios mantidas pelo executando o seguinte comando:
    sp_lock					
    você verá que, embora a última transação é concluída, bloqueios são mantidos nas tabelas de autores e títuloautores . O motivo é que a primeira transação não foi concluída e quando a transação segunda foi executada da mesma conexão, ele foi tratado como uma transação aninhada.

    Você pode exibir a contagem de transação, verificando @@ trancount variável global emitindo a instrução a seguir:
    select @@trancount					
    esta consulta retorna 1, que indica que uma transação pendente.

    Quaisquer outras transações que são executadas a partir desta conexão são tratadas como aninhados. Bloqueios continuar acumular e não são liberados até que um ROLLBACK é executada, quais reversões para a transação mais externa ou para um ponto de salvamento.
Continuar com o exemplo, você pode ver como uma reversão pode causar uma transação a ser negado ao executar a transação a seguir da mesma conexão concluída:
Begin TranUpdate titles set royalty = 0Rollback				
a reversão traz o lote de volta para a transação externa, embora não haja uma transação concluída (2) em títuloautores . A reversão na transação concluída ocorre porque a transação concluída é tratada como uma transação aninhada.

Para evitar esse tipo de problema, verificar após cada transação para saber se a transação foi concluída usando a instrução a seguir:
If @@trancount > 0 rollback				

REFERÊNCIAS

Para obter uma descrição de como monitorar o bloqueio com scripts SQL no SQL Server 7.0 ou SQL Server 2000, consulte os seguintes artigos na Base de dados de Conhecimento da Microsoft:
251004Como monitorar o bloqueio de SQL Server 7.0
271509Como monitorar o bloqueio no SQL Server 2005 e no SQL Server 2000

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 295108 - Última Revisão: 12/23/2005 21:32:32 - Revisão: 3.5

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbmt kbinfo KB295108 KbMtpt
Comentários