To pytanie jest następujące: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically
Mimo to nadal mam sytuacje impasu / przekroczenia limitu czasu w aplikacji ASP.NET podczas jednoczesnego uruchamiania dużych raportów READ_COMMITTED_SNAPSHOT ON
.
Mam więc dwa pytania:
- Jak mogę sprawdzić, czy migawka poziomu izolacji transakcji działa zgodnie z oczekiwaniami / wcale?
- Zakładam, że klucze obce (w tabelach aplikacji sieci Web do tabel raportów) są odpowiedzialne za zakleszczenia. Znalazłem ten interesujący artykuł :
Uwaga: SQL Server nabywa współdzielone blokady podczas sprawdzania poprawności kluczy obcych, nawet jeśli transakcja używa odczytu zatwierdzonego obrazu stanu (odczyt zatwierdzonego przy użyciu wersji wiersza) lub poziomu izolacji obrazu stanu. Należy o tym pamiętać, badając wykresy zakleszczenia transakcji, gdy stosowane są te poziomy izolacji transakcji. Jeśli widzisz udostępnione blokady, sprawdź, czy blokady są przyjmowane na obiekcie, do którego odwołuje się klucz obcy.
Jak mogę sprawdzić, czy FK są naprawdę odpowiedzialni za sytuacje zakleszczenia / przekroczenia limitu czasu, czy to oznacza, że mogę usunąć te klucze obce, aby zapobiec zakleszczeniom (co byłoby akceptowalnym wysiłkiem)?
Uwaga : Czytam tylko z tabel, które powodują zakleszczenia.
Wszelkie przemyślenia na ten temat są bardzo mile widziane.
Edytuj Oto wykres zakleszczenia . Może ktoś mógłby mi pomóc zrozumieć, co powoduje impas. Wygląda na to, że wystąpił bez uruchamiania raportów spowodowanych jedynie przez aplikację internetową, gdy dwie transakcje chcą zapisać tę samą tabelę (jedna aktualizacja i jedna wstawka, wstawka jest jak procedura przechowywana). Dlaczego blokuje strony i jak włączyć tylko blokady wierszy? Insert-SP już korzysta TRANSACTION ISOLATION LEVEL REPEATABLE READ
.
Mam silne podejrzenie, że za impas odpowiadają dwa wyzwalacze (jedna aktualizacja i jedna wkładka). Oto wyzwalacz wstawiania:
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
Tak więc ten wyzwalacz aktualizuje tabelę RMA, co powoduje uruchomienie wyzwalacza aktualizacji (co działa podobnie). Czy wykres impasu potwierdza moje założenie? Myślę, że usunę te wyzwalacze i utworzę SP działający raz dziennie, co byłoby całkowicie wystarczające, ponieważ te kolumny są tylko dla SSAS-Cube (Molap).
Edycja : Nawiasem mówiąc, nie było już impasu, odkąd usunąłem te wyzwalacze :)