2009-07-10 13 views
6

Podczas uruchamiania procedury składowanej (z aplikacji .NET), która wykonuje INSERT i AKTUALIZACJĘ, czasami (ale nie tak często, naprawdę) i losowo otrzymuję ten błąd :Sybase ASE: "Twoja komenda serwera napotkała sytuację zakleszczenia"

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Your server command (family id #0, process id #46) encountered a deadlock situation. Please re-run your command.

Jak mogę to naprawić?

Dzięki.

+1

Czy wiesz, czym jest impas, dlaczego może dojść do impasu ... i dlaczego to * dzieje się z * twoim * kodem? Czy próbowałeś Googling dla takich jak "sybase" i "deadlock"? – ChrisW

+0

Tak, wiem, co to jest, tak, mam googleed. Problem w tym, że impas zdarza się bardzo rzadko. Ponieważ zapytanie jest proste (aktualizacja i wstawienie), powinno być w najgorszym przypadku * opóźnione * przez serwer, jeśli inna blokada go blokuje, a nie tylko go wyrzucać. Ponadto błąd nie mówi, na czym polegał zakleszczenie (tabela, wiersz itp.), Co utrudnia rozwiązanie problemu. Nie mogę ręcznie uniemożliwić wysyłania 2 zapytań na serwer w tym samym czasie! – Laurent

+1

Zakleszczenie nigdy nie opóźnia innych procesów, które przerywają drugi proces - martwię się bardziej na temat zakleszczeń, ponieważ nie okazałeś zrozumienia – Mark

Odpowiedz

0

Zakładając, że twoje tabele są poprawnie indeksowane (i że faktycznie używasz tych indeksów - zawsze warte sprawdzenia za pomocą planu kwerend) możesz spróbować złamać części komponentu SP i zawijać je w oddzielnych transakcjach, tak aby każda jednostka pracy jest zakończona przed następnym uruchomieniem.

begin transaction 
    update mytable1 
    set mycolumn = "test" 
    where ID=1 

commit transaction 
go 

begin transaction 
    insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1 
commit transaction 
go 
+0

Właściwie, dzisiaj znowu miałem ten sam problem z procedurą składowaną, która zawiera tylko jedną instrukcję (INSERT) ... – Laurent

6

Najprościej rozwiązywania ty deadlocking problemu jest ustawienie „drukowania informacji zakleszczenia” się na wykorzystaniu

sp_configure „informacje druku impasu”, 1

Everytime jest impas będzie drukować informacje o tym, jakie procesy były zaangażowane i jakie sql były one uruchomione w momencie dead lock.

Jeśli Twoje tabele używają blokowania wszystkich stron. Może zmniejszyć zakleszczenia, aby przełączyć się na blokowanie datariów lub baz danych. Jeśli to zrobisz, upewnij się, że zbierasz nowe statystyki w tabelach i odtwarzasz indeksy, widoki, procedury składowane i wyzwalacze, które uzyskują dostęp do tabel, które zostały zmienione. Jeśli tego nie zrobisz, otrzymasz błędy lub nie zobaczysz pełnych korzyści ze zmiany w zależności od tego, które z nich nie zostaną odtworzone.

2

Mam zestaw długoterminowych aplikacji, które sporadycznie nad dostępem do stołu i sybase rzuci ten błąd. Jeśli sprawdzisz log serwera sybase, dostarczysz pełne informacje o przyczynie. Podobne do: sql, który był zaangażowany w dwa procesy próbujące uzyskać blokadę. Zwykle jeden próbuje czytać, a drugi robi coś podobnego do usunięcia. W moim przypadku aplikacje działają w oddzielnych maszynach JVM, więc nie można ich synchronizować tylko okresowo.