Czy ktoś może mi pomóc w impasie w SQL Server 2005?Zakleszczenie programu SQL Server 2005 z nieklastrowanym indeksem
Dla prostego testu, mam tabelę "Book", która ma klucz podstawowy (id) i nazwę kolumny. Domyślnym indeksem tego klucza podstawowego jest nieklastrowany.
Zakleszczenie występuje, gdy dwie sesje są uruchamiane w tym samym czasie. Monitor aktywności pokazuje pierwszą sesję "// krok 1" blokuje wiersz (pozbywanie się blokady) za pomocą X-lock. Druga sesja utrzymuje wiersz U lock i klawisz U lock. Obraz zakleszczenia pokazuje "// krok 2" pierwszej sesji wymaga klucza U lock.
Jeśli indeks to w klastrze, nie ma w tym przypadku żadnego zakleszczenia. "// step 1" będzie przechowywać wiersz i blokadę klucza w tym samym czasie, więc nie ma problemu. Rozumiem, że blokowanie wiersza spowoduje również zablokowanie indeksu, ponieważ węzeł liścia indeksu klastrowego to dane wiersza.
Ale dlaczego jest nieklastrowany indeks w ten sposób? Jeśli druga sesja zawiera klucz U lock, to dlaczego "krok 1" pierwszej sesji nie posiada tej blokady, ponieważ są one takie same jak instrukcja aktualizacji.
--// first session
BEGIN TRAN
update Book set name = name where id = 1 //step 1
WaitFor Delay '00:00:20'
update Book set name = 'trans' where id = 1 //step2
COMMIT
--// second session
BEGIN TRAN
--// this statement will keep both RID(U lock) and KEY(U lock) if first session did not use HOLDLOCK
update Book set name = name where id = 1
COMMIT
Czy w ogóle masz klucz klastrowany na swoim próbnym stole książki? Nie sądzę, że chodzi o to, czy twój PK jest skupiony, czy nie - myślę, że chodzi bardziej o to, czy faktycznie masz klucz klastrowany (i tym samym tabelę w klastrze), czy też masz do czynienia z stertą (bez indeksu klastrowego) –
Czy możesz dodać odpowiednie wyjście 'exec sp_lock', gdy jest w impasie? – Andomar
Od sqlprofiler obraz zakleszczenia pokazuje "// krok2" pierwszej sesji wymaga klucza U lock, ale jest on przechowywany przez seesion2. –