2012-05-24 8 views
9

Mam tabelę w serwerze SQL, który jest CRUD-ed równocześnie przez procedury przechowywanej uruchomione jednocześnie w różnych sesjach:Czy dodanie kolumny tożsamości klucza głównego może rozwiązać problemy z zakleszczeniem?

|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|

Procedura przebiega następująco:

  1. Wygeneruj identyfikator GUID.
  2. wstawić kilka rekordów do wspólnego stołu opisanego powyżej, oznaczając je GUID od kroku 1.
  3. wykonać kilka aktualizacji na wszystkich rekordów z kroku 2.
  4. Wybierz rekordy od kroku 3 jako wyjście SP.

Każdy select/insert/update/delete oświadczenia w procedurze przechowywanej ma WHERE JobGUID = @jobGUID klauzuli, więc procedura działa tylko z zapisów on wprowadził na punkcie 2. Czasami jednak, gdy ta sama procedura przechowywana biegnie równolegle w różnych połączeniach na wspólnym stole występują zakleszczenia. Oto wykres zakleszczenia z SQL Server Profiler:

SQL Server Profiler Deadlock Graph

Blokada eskalacja nie występują. Próbowałem dodać wskazówki blokujące do wszystkich instrukcji DML i/lub zawijając treść procedury w transakcji i używając różnych poziomów izolacji, ale to nie pomogło. Nadal ta sama blokada RID na współdzielonej tabeli.

Po tym odkryłem, że tabela udostępniona nie ma klucza głównego/kolumny tożsamości. I raz dodałem go, zakleszczenia wydaje się, że zniknął:

alter table <SharedTable> add ID int not null identity(1, 1) primary key clustered 

Kiedy usunąć kolumnę klucza podstawowego, że zakleszczenia są z powrotem. Kiedy dodaję to z powrotem, nie mogę odtworzyć tego impasu.

Pytanie brzmi, czy kolumna z kluczem głównym jest w stanie rozwiązać zakleszczenia, czy jest to tylko zbieg okoliczności?

Aktualizacja: jak @Catcall sugeruje, próbowałem stworzenia naturalnego środowiska klastrowego klucza podstawowego na istniejących kolumn (bez dodawania kolumny tożsamości), ale nadal złowione tego samego impasu (oczywiście, tym razem był to klucz blokada zamiast blokady RID).

+0

jest kolumna GUID indeksowane? –

+0

@MartinSmith: Tak, ma nieunikalny indeks nieklastrowy. –

+0

Na jakim poziomie izolacji transakcji działają SP? –

Odpowiedz

4

Najlepszy zasób (nadal) do rozwiązywania zakleszczeń jest tutaj: http://blogs.msdn.com/b/bartd/archive/2006/09/09/deadlock-troubleshooting_2c00_-part-1.aspx.

Pt # 4 mówi:

Uruchom zapytań związanych z impasu poprzez Database Tuning Advisor. Zamień zapytanie w oknie zapytania Management Studio, zmień kontekst db na prawidłową bazę danych, kliknij prawym przyciskiem myszy tekst zapytania i wybierz "Analizuj zapytanie w DTA". Nie pomijaj tego kroku; ponad połowa problemów z zakleszczeniem, które widzimy, jest rozwiązywanych po prostu przez dodanie odpowiedniego indeksu , aby jedno z zapytań działało szybciej i z mniejszym śladem blokady.Jeśli DTA zaleca indeksy (będzie to oznaczać "Szacowana poprawa:%"), utwórz je i monitoruj do , zobacz, czy zakleszczenie trwa. Możesz wybrać "Zastosuj rekomendacje" z menu rozwijanego Akcja, aby natychmiast utworzyć indeks, lub zapisz polecenie CREATE INDEX jako skrypt, aby je utworzyć podczas okna konserwacji . Pamiętaj, aby dopasować każde z pytań osobno.

wiem, że to nie „odpowiedź” na pytanie, dlaczego koniecznie, ale to nie dowodzi, że dodanie indeksów można zmienić wykonanie w sposób, aby ani śladu blokady mniejszy lub wykonanie czas szybciej, co może znacząco zmniejszyć szanse na impas.

1

Ostatnio widziałem ten post, zgodnie z powyższymi informacjami Mam nadzieję, że ten post pomoże,

http://databaseusergroup.blogspot.com/2013/10/deadlocked-on-sql-server.html

+1

Należy pamiętać, że [odpowiedzi dotyczące tylko łącza] (http://meta.stackoverflow.com/tags/link-only-answers/info) są odradzane, odpowiedzi w formacie SO powinny być punktem końcowym wyszukiwania rozwiązania (vs. jeszcze jeden przystanek referencji, które z czasem zanikają). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

Powiązane problemy