Questa è una domanda di follow-up da: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically
Tuttavia, ho ancora situazioni di deadlock / timeout nell'applicazione ASP.NET quando eseguo report di grandi dimensioni contemporaneamente READ_COMMITTED_SNAPSHOT ON
.
Quindi ho due domande:
- Come posso verificare se l' istantanea del livello di isolamento della transazione funziona come previsto / a tutti?
- Suppongo che le chiavi esterne (nelle tabelle dell'applicazione Web alle tabelle dei report) siano responsabili dei deadlock. Ho trovato questo interessante articolo :
Nota SQL Server acquisisce i blocchi condivisi durante la convalida delle chiavi esterne, anche se la transazione utilizza lo snapshot di commit della lettura (read commit utilizzando il controllo delle versioni di riga) o il livello di isolamento dello snapshot. Prestare attenzione a ciò quando si esaminano i grafici di deadlock dalle transazioni quando vengono utilizzati questi livelli di isolamento delle transazioni. Se vedi i blocchi condivisi, controlla se i blocchi vengono acquisiti su un oggetto a cui fa riferimento una chiave esterna.
Come posso verificare se l'FK è realmente responsabile delle situazioni di deadlock / timeout, ciò significa che potrei eliminare quelle chiavi esterne per evitare deadlock (quale sarebbe uno sforzo accettabile)?
Nota : sto leggendo solo dalle tabelle che causano deadlock.
Qualsiasi pensiero su questo argomento è molto apprezzato.
Modifica Ecco un grafico a deadlock . Forse qualcuno potrebbe aiutarmi a capire cosa causa lo stallo. Sembra che si sia verificato senza alcun report in esecuzione causato solo dall'applicazione Web, quando due transazioni vogliono scrivere la stessa tabella (un aggiornamento e un inserto, l'inserimento è come Stored-Procedure). Perché acquisisce i blocchi di pagina e come abilitare solo i blocchi di riga? Insert-SP utilizza già TRANSACTION ISOLATION LEVEL REPEATABLE READ
.
Ho il forte sospetto che due trigger (un aggiornamento e un inserto) siano responsabili dei deadlock. Ecco il trigger di inserimento:
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
Quindi questo trigger aggiorna la tabella RMA cosa provoca l'attivazione del trigger di aggiornamento (cosa fa simile). Il diagramma di deadlock conferma la mia ipotesi? Penso che eliminerò quei trigger e creerò un SP che è in esecuzione una volta al giorno ciò che sarebbe perfettamente sufficiente, perché queste colonne sono solo per un cubo SSAS (Molap).
Modifica : A proposito, non ho più avuto deadlock da quando ho eliminato questi trigger :)