Czasami przy próbie wykonania polecenia update zdarza się taki komunikat od serwera MS SQL 2008 R2
Transaction (Process ID 99) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Rozumiem, że żeby było zakleszczenie, to muszą być co najmniej dwa procesy, jeżeli serwer MS SQL wykryje zakleszczenie, to zabija przynajmniej jeden proces, żeby zakleszczenie przestało zachodzić.
Oczywiście najlepiej jest jeszcze raz zaprojektować bazę danych i logikę biznesową, żeby nie zachodziły warunki, w których dochodzi do zakleszczeń.
Czy w zapytaniach SQL istnieje jakaś klauzula lub parametr, który określa wyższy lub niższy priorytet?
Chodzi o to, że mam zapytanie A i zapytanie B, które często są uruchamiane naraz i mogą powodować zakleszczenie. Chodzi o to, żeby za każdym razem bez wyjątku serwer SQL przy zakleszczeniu zabijał zapytanie B, a zapytanie A zostało wykonane. W tym przypadku zapytannie A ma jakby wyższy priorytet niż B. Oczywiście, jak nie wystąpi zakleszczenie, to wykonają się oba zapytania.
WITH (ROWLOCK)
to jedynie sugestia dla LockManagera, aby blokował na poziomie strony - ale i tak sam zdecyduje o poziomie ziarnistości blokad. Domyślnie jest tak, że LockManager decyduje o eskalacji blokad i jeśli np. polecenieUPDATE
blokuje więcej niż 25 wierszy, to następuje eskalacja blokady na stronę - bo tak jest szybciej.