Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как получить блокирующий запрос в blocked process report?  [new]
vi0
Member

Откуда:
Сообщений: 132
Microsoft SQL Server 2012 Express SP4 (64-bit)

Кратко:

Экспериментирую в профайлере с событием "blocked process report" с целью получить тексты запросов заблокированного и блокирующего. Первый получаю, а на месте второго выводится команда следующая за запросом, который фактически был заблокирован.

Подробно:

- Настраиваю базу для получения события "blocked process report"
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'blocked process threshold', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO


- В профайлере включаю отслеживание события "blocked process report"

- Сначала в первом сеансе, потом втором выполняю следующий запрос:
begin tran
go

UPDATE t1 SET c3 = 'a'
from [test1].[dbo].[t1] as t1 WITH(SERIALIZABLE)
WHERE c4 = 100
go 

print 123
go


- Как я и хотел, второй сеанс ожидает завершения первого, т.к. транзакция в первом не закрыта.
- Профайлер показывает это ожидание событием "blocked process report", в котором следующее (см ниже под спойлером)

Вопрос: Почему в поле заблокированного запроса выводится print, а не UPDATE?

+
<blocked-process-report monitorLoop="27156">
<blocked-process>
<process id="process16e342558" taskpriority="0" logused="0" waitresource="KEY: 5:72057594039369728 (dbff0d4a5b42)" waittime="9953" ownerId="620453" transactionname="user_transaction" lasttranstarted="2019-05-04T13:39:29.430" XDES="0x172557368" lockMode="RangeX-X" schedulerid="1" kpid="8444" status="suspended" spid="61" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2019-05-04T13:39:29.430" lastbatchcompleted="2019-05-04T13:39:29.430" lastattention="1900-01-01T00:00:00.430" clientapp="Среда Microsoft SQL Server Management Studio - запрос" hostname="" hostpid="3632" loginname="\User" isolationlevel="read committed (2)" xactid="620453" currentdb="5" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
<executionStack>
<frame line="2" stmtstart="4" sqlhandle="0x020000005bbf481b1f8de1209b28a9bcf1bc548cc34bbaa20000000000000000000000000000000000000000"/>
</executionStack>
<inputbuf>

UPDATE t1 SET c3 = 'a'
from [test1].[dbo].[t1] as t1 WITH(SERIALIZABLE)
WHERE c4 = 100
</inputbuf>

</process>
</blocked-process>
<blocking-process>
<process status="sleeping" spid="66" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2019-05-04T13:39:26.973" lastbatchcompleted="2019-05-04T13:39:26.973" lastattention="1900-01-01T00:00:00.973" clientapp="Среда Microsoft SQL Server Management Studio - запрос" hostname="" hostpid="7912" loginname="\User" isolationlevel="read committed (2)" xactid="620446" currentdb="1" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
<executionStack/>
<inputbuf>

print 123
</inputbuf>

</process>
</blocking-process>
</blocked-process-report>
4 май 19, 10:30    [21877657]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
vi0
Member

Откуда:
Сообщений: 132
автор
Вопрос: Почему в поле заблокированного запроса выводится print, а не UPDATE?

Опечатался. Верно так:
Почему в поле блокирующего запроса выводится print, а не UPDATE?
4 май 19, 11:25    [21877666]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1009
vi0,

потому что inputbuff показывает инструкцию последнего батча сессии а не инстуркцию которая наложила блокировку.

закоментите go между update и print получите их обе в inputbuff
4 май 19, 15:51    [21877758]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
vi0
Member

Откуда:
Сообщений: 132
felix_ff,

а к чему такая логика, в контексте расследования блокировок? где можно прочитать про это?
Дело в том что я не могу повлиять на текст запросов, т.к. его формирует сервер приложений.
4 май 19, 16:08    [21877760]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
vi0
а к чему такая логика, в контексте расследования блокировок?
Считаете, что сервер обязан хранить тектсы всех выполненных в транзакции батчей до ее завершения? Плюс для каждой блокировки хранить ссылку на батч, который ее наложил?
4 май 19, 17:10    [21877784]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
vi0
Member

Откуда:
Сообщений: 132
invm
vi0
а к чему такая логика, в контексте расследования блокировок?
Считаете, что сервер обязан хранить тектсы всех выполненных в транзакции батчей до ее завершения? Плюс для каждой блокировки хранить ссылку на батч, который ее наложил?
даже и не знаю
просто изучаю инструмент и до сих пор думал, что я чего то недонастроил
4 май 19, 17:22    [21877788]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
invm
Member

Откуда: Москва
Сообщений: 8554
vi0,

Этот инстумент предназначен только для генерации уведомлений о том, что сессия S1 была заблокирована сессией S2.
К тому же, невозможно гарантированно выявить блокирующий запрос.
4 май 19, 17:46    [21877796]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокирующий запрос в blocked process report?  [new]
vi0
Member

Откуда:
Сообщений: 132
invm
vi0,

Этот инстумент предназначен только для генерации уведомлений о том, что сессия S1 была заблокирована сессией S2.
К тому же, невозможно гарантированно выявить блокирующий запрос.
я бы не сказал, что только, с учетом того сколько полей в этом отчете
4 май 19, 18:10    [21877807]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить