Czy klucze obce mogą powodować zakleszczenia i utrudniać ODCZYTANIE ZAANGAŻOWANEGO SNAPSHOTA?

19

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:

  1. Jak mogę sprawdzić, czy migawka poziomu izolacji transakcji działa zgodnie z oczekiwaniami / wcale?
  2. 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 :)

Tim Schmelter
źródło

Odpowiedzi:

16

Jeśli zespół SQLCAT powie, że walidacja FK odbywa się przy użyciu izolacji zatwierdzonej do odczytu, to musi wiedzieć, o czym mówi. Nacisk na walidację . Prawdziwe pytanie brzmi: dlaczego raport miałby uruchamiać walidację FK ? Sprawdzanie poprawności następuje w przypadku zapisów , a raporty powinny być odczytywane . Albo twoje raporty powodują zapis, w którym to przypadku poziomy izolacji migawki nic nie pomogą, albo przyczyna impasu jest inna.

Jedynym sposobem na osiągnięcie postępu jest uchwycenie wykresu impasu.

Jeśli chodzi o drugie pytanie, jak sprawdzić, czy działasz w izolacji migawkowej: zajrzyj do środka sys.dm_tran_active_snapshot_database_transactions.

Remus Rusanu
źródło
2

Sprawdzanie poprawności klucza obcego musi nastąpić w przypadku (zablokowanego) odczytu zatwierdzonego dla poprawności. Zobacz Izolacja migawki: zagrożenie dla integralności? autor: Hugo Kornelis po szczegóły.

Wykres zakleszczenia pokazuje dwa jednoczesne działania RM2.dbo.RMApowodujące zakleszczenie. W Twoich wyzwalaczach brakuje warunku łączenia między RMAa inserted.

Wydaje się prawdopodobne, że jest to niedopatrzenie, a Twój wyzwalacz przypadkowo aktualizuje wszystkie wiersze, RMAwięc zakleszczenia są niezwykle prawdopodobne, jeśli występuje więcej niż jedno jednoczesne wykonanie wyzwalacza.

użytkownik126897
źródło