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:
- Como posso verificar se o Instantâneo do nível de isolamento da transação está funcionando como esperado / tudo?
- 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 :)
fonte