2017-01-04 5 views
0

Моя запланированная работа работает 6 раз в день. Иногда его неудачная причина тупика. Я попытался определить, кто блокирует мою сессию.SQL Server Deadlock

Я искал и обнаружил sql-профайлер, но не показывал точный результат. Как идентифицировать историю с T-SQL или любым другим способом?

Когда неудача показано сообщение об ошибке задания belown,

транзакции (идентификатор процесса) была заведена в тупике на ресурсах блокировки с другим процессом и была выбрана в качестве тупиковой жертвы. повторите транзакцию.

ответ

0

Это должно помочь идентифицировать жертва тупиковых или причины запирания: https://ask.sqlservercentral.com/questions/5982/how-can-i-identify-all-processes-involved-in-a-dea.html

Если вы хотите, чтобы снизить риск вашего процесса запирания здесь некоторые стратегии ...

  • Попробовать ВСТАВИТЬ/UPDATE/DELETE в том же порядке. Например. если один процесс делает это:

    BEGIN TRAN; UPDATE TableA; UPDATE TableB; COMMIT; 
    

в то время как другой процесс делает это:

BEGIN TRAN; UPDATE TableB; UPDATE TableA; COMMIT; 

существует риск того, что один процесс тупиковой другой. Чем больше времени для завершения, тем выше риск тупика. SQL Server просто выбирает один процесс как «Deadlock Victim» наугад.

  • Постарайтесь свести к минимуму код, связанный с транзакцией. То есть Меньше строк кода INSERT/UPDATE/DELETE между вашими операциями BEGIN TRANSACTION и COMMIT TRANSACTION
  • Обработайте меньшие партии данных, если это возможно. Если вы обрабатываете большое количество строк, попробуйте добавить пакет, поэтому код блокирует меньшие партии данных в любой момент времени.
+0

Спасибо за разъяснение Ник. Хорошего дня. – Oracsql

+0

Добро пожаловать! –