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

Откуда:
Сообщений: 179
Добрый день!
Столкнулся с такой ситуацией: в базе возникают дидлоки между процедурами, у которых нет никаких общих таблиц. Как это может быть?
Пример дидлока:
Deadlock graph	18309782	1	sa	0X01	17	srv-ascon		2017-04-24 09:02:28.820	<deadlock-list>
 <deadlock victim="process353ced708">
  <process-list>
   <process id="process353ced708" taskpriority="0" logused="840" waitresource="KEY: 7:72057611781275648 (2500bfa8ecb8)" waittime="3005" ownerId="1243433042" transactionname="implicit_transaction" lasttranstarted="2017-04-24T09:02:24.307" XDES="0x33660b7a0" lockMode="S" schedulerid="7" kpid="6632" status="suspended" spid="340" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2017-04-24T09:02:25.797" lastbatchcompleted="2017-04-24T09:02:25.797" clientapp="OurServerApplication" hostname="SRV" hostpid="5068" loginname="sa" isolationlevel="read committed (2)" xactid="1243433042" currentdb="7" lockTimeout="120000" clientoption1="673185824" clientoption2="128562">
    <executionStack>
     <frame procname="DB.dbo.proc1" line="29" stmtstart="1470" stmtend="1748" sqlhandle="0x03000700f137c257cfa67d0012a700000100000000000000">
unknown     </frame>
     <frame procname="adhoc" line="1" stmtstart="332" sqlhandle="0x010007005a76e01bd0a27d41020000000000000000000000">
exec dbo.proc1
    @param = @param1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@param1 int)  exec dbo.proc1
    @param = @param1    </inputbuf>
   </process>
   <process id="process3f15b88" taskpriority="0" logused="12484" waitresource="PAGE: 7:1:156309" waittime="2511" ownerId="1243432553" transactionname="implicit_transaction" lasttranstarted="2017-04-24T09:02:22.410" XDES="0x2efb723b0" lockMode="S" schedulerid="8" kpid="5248" status="suspended" spid="609" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2017-04-24T09:02:25.547" lastbatchcompleted="2017-04-24T09:02:25.547" clientapp="OurServerApplication" hostname="SRV" hostpid="6416" loginname="sa" isolationlevel="read committed (2)" xactid="1243432553" currentdb="7" lockTimeout="120000" clientoption1="673185824" clientoption2="128050">
    <executionStack>
     <frame procname="DB.dbo.proc2" line="12" stmtstart="454" sqlhandle="0x03000700e363985ffaa67d0012a700000100000000000000">
unknown     </frame>
     <frame procname="adhoc" line="1" stmtstart="84" sqlhandle="0x010007004cd83c2ec0a37d41020000000000000000000000">
exec dbo.proc2 @param  = @param1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@Param1 int)  exec dbo.proc2 @param  = @param1    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <keylock hobtid="72057611781275648" dbid="7" objectname="DB.dbo.table1" indexname="PK_table1" id="lockaea4e080" mode="X" associatedObjectId="72057611781275648">
    <owner-list>
     <owner id="process3f15b88" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process353ced708" mode="S" requestType="wait"/>
    </waiter-list>
   </keylock>
   <pagelock fileid="1" pageid="156309" dbid="7" objectname="DB.dbo.table2" id="lock39b776b80" mode="IX" associatedObjectId="72057611778785280">
    <owner-list>
     <owner id="process353ced708" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="process3f15b88" mode="S" requestType="wait"/>
    </waiter-list>
   </pagelock>
  </resource-list>
 </deadlock>
</deadlock-list>


proc1 - работает с таблицей table1 (spid 340)
proc2 - работает с таблицей table2 (а также другими таблицами) (spid 609)
Связей между таблицами этих процедур нет никаких.
Но при этом в том же spid 609 я вижу вызов другой процедуры proc3, которая может конфликтовать по ресурсам с proc1.
А для spid 340 ниже в профайлере вижу вызов процедуры proc4 с таймаутом, которая может конфликтовать с proc2.
Вопрос - может ли Deadlock graph отображать не всю информацию?
И еще вопрос: при анализе Lock:deadlock Chain увидел EventSubClass = 101 - Resource type Lock. О чем это может говорить? В документации нашел такие Типы подкласса:
101 = блокировка типа ресурса
102 = обмен типа ресурса
Чем они отличаются? Описаний не нашел.
26 апр 17, 09:15    [20434570]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
aleks2
Guest
Содержательно называете объекты. ФСБ или армейская разведка?

ЗЫ. Завязывайте с грибами. Обе ваши процедуры обращаются к указанным таблицам.
26 апр 17, 09:29    [20434611]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Tester666,

между таблицами reference?
26 апр 17, 09:31    [20434617]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Tester666
Member

Откуда:
Сообщений: 179
Между таблицами reference нет. Сам первый раз с таким столкнулся.
26 апр 17, 09:46    [20434664]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
o-o
Guest
если не referece, то может быть триггер на одной лезет в другую таблицу
26 апр 17, 09:55    [20434699]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
Разве там не внешний ключ причина?
26 апр 17, 10:44    [20434933]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Tester666
Member

Откуда:
Сообщений: 179
И триггеров нет.
26 апр 17, 10:47    [20434945]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Eleanor
Member

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

А если через statistics io проверить, то там не видно обращений к чужой таблице?

Она обычно удобно показывает, в каких таблицах запрашивались данные:
set statistics io on
exec dbo.proc1 @param = @param1

set statistics io on
exec dbo.proc2 @param = @param1
26 апр 17, 10:51    [20434961]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Eleanor,

вы ещё в план посмотреть предложите
26 апр 17, 10:54    [20434975]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
invm
Member

Откуда: Москва
Сообщений: 9285
Tester666
Связей между таблицами этих процедур нет никаких.
Это не значит, что при их одновременном выполнении не может появиться дедлок.
Дедлоки возникают в рамках транзакции. Вот вам и нужно анализировать, что происходит в этих транзакциях ранее, перед вызовами процедур.
26 апр 17, 10:59    [20434995]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Eleanor
Member

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

Ладно, предлагаю: посмотрите в план. В xml плана тоже можно по имени таблицу поискать.
26 апр 17, 11:01    [20435007]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Eleanor
Member

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

В дедлоке у вас есть интересный атрибут на обеих процедурах transactionname="implicit_transaction".
У вас везде неявные транзакции (открылось соединение - началась транзакция) и они действительно вам везде нужны?
26 апр 17, 11:41    [20435152]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Eleanor,

In most cases where IMPLICIT_TRANSACTIONS is ON, it is because the choice of SET ANSI_DEFAULTS ON has been made.
26 апр 17, 11:44    [20435164]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Tester666
Member

Откуда:
Сообщений: 179
invm, да, если в рамках транзакции, то причина понятна.
Меня удивило, что граф отобразил не все процедуры.
26 апр 17, 11:58    [20435241]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
invm
Member

Откуда: Москва
Сообщений: 9285
Tester666
Меня удивило, что граф отобразил не все процедуры.
А "все" это какие?
В графе отображено все, что связано с местом возникновения дедлока.
26 апр 17, 12:02    [20435262]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Tester666,

дайте полный план выполнения хоть одной из этих процедур, они кстати не вложенные?
26 апр 17, 12:06    [20435291]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
Eleanor
Member

Откуда:
Сообщений: 2815
Tester666
И еще вопрос: при анализе Lock:deadlock Chain увидел EventSubClass = 101 - Resource type Lock. О чем это может говорить? В документации нашел такие Типы подкласса:
101 = блокировка типа ресурса
102 = обмен типа ресурса
Чем они отличаются? Описаний не нашел.

Судя по английскому названию 102=Resource type Exchange - это дедлок на запросах с параллельным планом выполнения. У вас бы тогда в xml еще появились ноды <exchangeEvent>
101 - обычный дедлок, не связанный с параллелизмом.
26 апр 17, 12:53    [20435560]     Ответить | Цитировать Сообщить модератору
 Re: deadlock-причины  [new]
o-o
Guest
было бы 102, в графе бы была полнейшая фигня,
а не описание процесса и ресурсов.
вот у нас:

Deadlock encountered .... Printing deadlock information
Wait-for graph
NULL
Node:1
Port: 0x0000000945930640 Xid Slot: 5, Wait Slot: 2, Task: 0x00000008E08C5708, (Producer), Exchange Wait Type: e_waitPipeNewRow, Merging: 1
ResType:ExchangeId Stype:'AND' SPID:95 BatchID:0 ECID:24 TaskProxy:(0x000000091025E500) Value:0xe08c5708 Cost:(20/0)
SPID: 95 ECID: 24 Statement Type: SELECT INTO Line #: 475
Input Buf: No Event:
NULL
Node:2
Port: 0x000000094658DCA0 Xid Slot: 7, Wait Slot: 0, Task: 0x000000008D226088, (Producer), Exchange Wait Type: e_waitPipeNewRow, Merging: 1
ResType:ExchangeId Stype:'AND' SPID:95 BatchID:0 ECID:6 TaskProxy:(0x00000006F2579BE0) Value:0x8d226088 Cost:(20/0)
SPID: 95 ECID: 6 Statement Type: SELECT INTO Line #: 475
Input Buf: No Event:
NULL
Node:3
Port: 0x0000000946531060 Xid Slot: 2, Wait Slot: 7, Task: 0x000000099C1D2E08, (Consumer), Exchange Wait Type: e_waitPipeGetRow, Merging: 0
ResType:ExchangeId Stype:'AND' SPID:95 BatchID:0 ECID:10 TaskProxy:(0x00000006F2579EE0) Value:0x9c1d2e08 Cost:(0/10000)
SPID: 95 ECID: 10 Statement Type: SELECT INTO Line #: 475
Input Buf: No Event:
NULL
Node:4
Port: 0x0000000945931170 Xid Slot: 0, Wait Slot: 5, Task: 0x0000000830527DC8, (Consumer), Exchange Wait Type: e_waitPipeGetRow, Merging: 0
ResType:ExchangeId Stype:'AND' SPID:95 BatchID:0 ECID:9 TaskProxy:(0x00000006F2579E80) Value:0x30527dc8 Cost:(0/10000)
SPID: 95 ECID: 9 Statement Type: SELECT INTO Line #: 475
Input Buf: No Event:
26 апр 17, 13:17    [20435711]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить