2014-04-14 29 views
6

mam procedura przechowywana, która jest wywoływana przez SQL Server 2012 raport, który bierze wiek do uruchomienia produkcji w porównaniu do rozwoju z powodu sesji blokującego lck_m_sSQL Server LCK_M_S zdarza się tylko w produkcji

Przechowywane przebiega procedura natychmiast po uruchomieniu w SQL Server Management Studio, a także działa dobrze po wywołaniu jako część raportu z laptopa dev przez Visual Studio.

Po przesłaniu raportu na serwer produkcyjny pojawia się ten problem z blokowaniem.

Jak mogę się dowiedzieć, co jest przyczyną problemu lck_m_s podczas produkcji?

Odpowiedz

10

Wykonanie tej kwerendy, gdy problem się powtórzy:

select * from 
sys.dm_os_waiting_tasks t 
inner join sys.dm_exec_connections c on c.session_id = t.blocking_session_id 
cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) as h1 

To daje spid sesji, który spowodował blokadę, na którym zasób został zablokowany, a tekst z najbardziej zapytania rcent dla tej sesji. To powinno dać ci solidny punkt wyjścia.

0

Masz kilka opcji

  1. skonfigurować zablokowany raport procesu. Zasadniczo ustawiasz konfigurację systemu blocked process threshold (s) na niezerową liczbę sekund i konfigurujesz powiadomienie o zdarzeniu w zdarzeniu BLOCKED_PROCESS_REPORT. Otrzymasz raport XML za każdym razem, gdy jakikolwiek proces zostanie zablokowany na więcej niż ustawiony próg. Wadą tego jest to, że wszystko będzie blokowane, a nie tylko procedura, ale dostaniesz w raporcie każdego, kto trzyma niekompatybilną blokadę.

  2. Skonfiguruj sesję rozszerzonych zdarzeń dla swojej procedury, aby uchwycić zdarzenie lock_released, w którym czas trwania jest dłuższy niż oczekiwanie. Plusem jest to, że jest to bardzo ukierunkowane i można zdefiniować sesję, aby uzyskać bardzo mało hałasu. Wadą jest to, że nie wiesz, jaki proces trzyma niekompatybilny zamek (chociaż otrzymasz dość szczegółowy opis tego, czym jest zablokowany zasób, aby dalej badać).