анализ дэдлоков субд с помощью логов ТЖ

Пути решения взаимных блокировок

Модератор: Дмитрий Юхтимовский

анализ дэдлоков субд с помощью логов ТЖ

Сообщение somebody » 09 окт 2020, 02:24

Добрый день.
По слухам на экзамена по эксперту есть задача расследовать дэдлок на субд. Хочу научиться расследовать с помощью логов ТЖ.
Набросал себе базу, режим управления блокировками поставил "Автоматический". Решил потренироваться на случае захвата ресурсов в разном порядке.
Создал в конфе два документа и два регистра накоплений. в доках в обработке проведения явно записываю движения по регистрам в разном порядке. С помощью двух сеансов и отладчика воспроизвожу дэдлок, собираю логи.
Пытаюсь сделать как написано на ИТС: https://its.1c.ru/db/v8318doc/bookmark/adm/TI000000409
1. настроил сбор логов:
Код: выделить все
<config xmlns="http://v8.1c.ru/v8/tech-log">
   <dump location="C:\TEMP\v83\dumps" create="1" type="3"/>
   <log location="C:\TEMP\v83\logs\deadlock_subd" history="4">
      <event>
         <eq property="Name" value="DBMSSQL"/>
         <eq property="p:ProcessName" value="Test"/>
      </event>
      <event>
         <eq property="Name" value="EXCP"/>
         <eq property="p:ProcessName" value="Test"/>
      </event>
      <property name = "all"/>
   </log>
   <dbmslocks/>   
</config>


2. нашел первое событие с lka=1 и единственное событие с lkp=1. Получил lkaid и lkpid. В ИТС написано:
узнать значения свойств lkaid, lkpid и найти все события с этими значениями свойств в журналах всех рабочих процессов кластера. По найденной группе событий можно установить, кто кого заблокировал, на какое время и что они при этом делали.
Я нашел все события в которых, в моём случае lkaid=2 и lkpid=2, итого получилось:
12 событий с lkаid=2 и 1 событие с lkpid=2. Причем они идут так:
1ое событие виновника (lka=1)
затем еще 10 событий с lka=1
одно событие (lkp=1)
и еще одно событие с lka=1 (Sql=SELECT @@TRANCOUNT)
Из этой группы событий я могу получить два контекста и запросы СУБД которые вызвали взаимное ожидание. Но как получить контексты и запросы СУБД которые установили первые две блокировки, совершенно непонятно. В этих запросах ведь никаких пометок нет.
Еще вопрос про номера запросов к СУБД "кто кого заблокировал" (по факту номер запрос: SELECT spid, blocked FROM master.dbo.sysprocesses WITH(NOLOCK) WHERE blocked > 0 AND lastwaittype LIKE 'LCK_%'), они выводятся, но как их использовать в логах совершенно непонятно. В событие DBMSSQL в общем случае ведь нет таких полей.

есть конечно мысль искать по SessionID и имени ресурса, но в статье на ИТС вроде о другом речь....
somebody
 
Сообщений: 6
Зарегистрирован: 09 июн 2020, 10:03

Вернуться в Проблемы с взаимными блокировками

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1