Pergunta

Um dos meus colegas de trabalho tem um procedimento armazenado que faz o seguinte
Comece Tran
1) Gere dinamicamente uma instrução SELECT.
2) Insira na Tabela X
3) Execute a instrução SELECT
Final Tran

Se esse procedimento armazenado for executado por dois threads de septados simultaneamente, ele receberá o seguinte erro: System.data.sqlclient.sqLexception: Transação (ID do processo 57) foi implementado na trava | Recursos de buffer de comunicação com outro processo e foi escolhido como vítima de impasse. Execute a transação

Este procedimento armazenado é realmente o problema? Pela minha mente ingênua, isso parece ter uma condição de corrida, não um impasse.

Foi útil?

Solução

Duas sequências 'escrever e ler' podem definitivamente o impasse. Você omitiu alguns 'detalhes' em sua postagem, como o recurso real em que o impasse ocorre e que os pedidos estão envolvidos. Vamos voar pela sessão de nossas calças e ler nas entrelinhas, compensando grande parte do caso de uma postagem tão pouco documentada:

  1. Ler de gravação cruzada. O encadeamento 1 insere a linha com a tecla A e, em seguida, seleciona a linha com a tecla B. Thread 2 Insere a linha com a tecla B e seleciona a linha com a chave A. A ordem de execução é T1 (a), T2 (B), T1 (B) -Wait, T2 (A) -Deadlock.
  2. Leitura de gravação independente: T1 insere a então lê a, T2 insere B e depois lê B. Informações críticas: Não há índice na chave, então é necessária uma varredura de tabel para ler A e/ou B. A ordem de execução é que o T1 grava a, t2 grava B, T1 Leia A, inicia a varredura, bloqueia o X-Lock do T2 no B, T2 Leia B, inicia o Scan, bloqueia o X-Lock do T1 em A, Deadlock.
  3. Independente otimizado escrever ler. Este caso é o mais feroz para a maioria dos recém -chegados, quando os índices de acesso adequados ainda ocorrem de impulso. Eu apresentei este caso em Leia/Escreva Deadlock, uma atualização pode deadlock agaisnt uma leitura por causa de diferentes pedidos de acesso ao índice. É improvável que seja o seu caso, mas com uma documentação tão ruim, tudo é possível.

Muitos mais cenários de impasse são possíveis, mas entraríamos em esotéricos ou começamos a extrapolar muito longe para as informações ausentes no OP.

Se eu me arriscar, o caso mais provável é 2). O caso 1) provavelmente seria facilmente identificador. O caso 2) é um pouco mais difícil de detectar na análise de código simples, pois depra o projeto do esquema físico (estrutura do índice).

Outras dicas

Execute um rastreamento no Profiler (escolha o modelo em branco), selecione o evento gráfico de deadlock e na nova guia que aparece (Configurações de extração de eventos), salve cada (verifique os eventos XML de impasse separadamente) em seu próprio arquivo. Abra este arquivo em um visualizador XML e será fácil dizer o que está acontecendo. Cada processo está contido, com uma pilha de chamadas de procedimento etc. e todas as fechaduras também estão lá, para que você possa ter certeza do que está causando o impasse.

Deixe esse rastreamento correr até que o impasse aconteça novamente, as informações só serão gravadas quando um impasse acontecer, portanto, não há muita sobrecarga.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top