As chaves estrangeiras podem causar impasses e dificultar o LEITURA INSTANTÂNEO COMPROMISSO?

19

Esta é uma pergunta de acompanhamento em: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically

Ainda estou tendo situações de deadlock / timeout no aplicativo ASP.NET ao executar grandes relatórios simultaneamente READ_COMMITTED_SNAPSHOT ON.

Então, eu tenho duas perguntas:

  1. Como posso verificar se o Instantâneo do nível de isolamento da transação está funcionando como esperado / tudo?
  2. Estou assumindo que as chaves estrangeiras (nas tabelas do Aplicativo da Web nas tabelas de relatório) são responsáveis ​​por conflitos. Encontrei este artigo interessante :

Nota O SQL Server adquire bloqueios compartilhados ao validar chaves estrangeiras, mesmo se a transação estiver usando o instantâneo confirmado por leitura (leitura confirmada usando o controle de versão de linha) ou o nível de isolamento do instantâneo. Lembre-se disso ao examinar gráficos de deadlock de transações quando esses níveis de isolamento de transação são usados. Se você vir bloqueios compartilhados, verifique se os bloqueios foram executados em um objeto que é referenciado por uma chave estrangeira.

Como posso verificar se o FK é realmente responsável pelas situações de Deadlock / Timeout, isso significa que eu poderia excluir essas chaves estrangeiras para evitar conflitos (o que seria um esforço aceitável)?

Nota : estou lendo apenas as tabelas que causam conflitos.

Qualquer opinião sobre este tópico é muito apreciada.


Editar Aqui está um gráfico de deadlock . Talvez alguém possa me ajudar a entender o que causa o impasse. Parece que ocorreu sem nenhum relatório em execução causado apenas pelo aplicativo Web, quando duas transações desejam escrever a mesma tabela (uma atualização e uma inserção, a inserção é como Procedimento Armazenado). Por que ele adquire bloqueios de página e como habilitar apenas bloqueios de linha? O Insert-SP já usa TRANSACTION ISOLATION LEVEL REPEATABLE READ.

Eu tenho uma forte suspeita de que dois gatilhos (uma atualização e uma inserção) são responsáveis ​​pelos impasses. Aqui está o gatilho de inserção:

CREATE TRIGGER [dbo].[CreateRMAFiDates] 
   ON  [dbo].[RMA] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE RMA 
    SET [fiCreationDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
        [fiPopDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
        [fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
    FROM INSERTED;
END

Portanto, esse gatilho atualiza a tabela RMA, o que faz com que o gatilho de atualização seja acionado (o que é semelhante). O gráfico de deadlock confirma minha suposição? Acho que vou excluir esses gatilhos e criar um SP que esteja sendo executado uma vez por dia o que seria perfeitamente suficiente, porque essas colunas são apenas para um SSAS-Cube (Molap).

Edit : By the way, não havia mais impasse desde que eu apaguei esses gatilhos :)

Tim Schmelter
fonte

Respostas:

16

Se a equipe do SQLCAT disser que a validação do FK é feita usando o isolamento confirmado pela leitura, eles deverão saber do que estão falando. Ênfase na validação . A verdadeira questão é: por que um relatório acionaria a validação de FK ? A validação ocorre nas gravações e os relatórios devem ser leituras . Seus relatórios estão causando gravações; nesse caso, os níveis de isolamento da captura instantânea não ajudam em nada; a causa do conflito é diferente.

A única maneira de progredir é capturar o gráfico de deadlock.

Quanto à outra pergunta, como você pode verificar se opera sob isolamento de instantâneo: veja sys.dm_tran_active_snapshot_database_transactions.

Remus Rusanu
fonte
2

Validação da chave estrangeira tem de ocorrer em (bloqueio) Ler comprometida quanto à correção. Consulte Isolamento de instantâneo: uma ameaça à integridade? por Hugo Kornelis para detalhes.

O gráfico de deadlock mostra duas execuções simultâneas de RM2.dbo.RMAcausar o deadlock. Seus acionadores estão sem uma condição de junção entre RMAe inserted.

Parece provável que isso seja um descuido e seu gatilho esteja atualizando acidentalmente todas as linhas, de RMAmodo que é extremamente provável que ocorram conflitos se houver mais de uma execução simultânea de gatilho.

user126897
fonte