Как найти причину Deadlock в MS SQL

K000k
Posts: 1
Joined: 12 Oct 2017 09:55

Как найти причину Deadlock в MS SQL

Post by K000k »

Помогите плз, не могу найти где искать источник Deadlock
https://yadi.sk/i/oD25kUrf3Ngj6g
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Как найти причину Deadlock в MS SQL

Post by Dmitry67 »

Получите deadlock graph, он в XML
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

Вам обоим надо поставить двойку. Один задает вопрос ответ на который дается в каждом учебнике по реляционным базам данных и системам с блокировками ресурсов вообще. А второй пытается помочь этому.
Возможно также что вопрос сформирован не корректно. Автор, наверное, спрашивает о том как узнать какие процессы создали deadlock и на каком ресурсе.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Как найти причину Deadlock в MS SQL

Post by Dmitry67 »

zVlad wrote: 17 Oct 2017 18:55 Вам обоим надо поставить двойку. Один задает вопрос ответ на который дается в каждом учебнике по реляционным базам данных и системам с блокировками ресурсов вообще. А второй пытается помочь этому.
Возможно также что вопрос сформирован не корректно. Автор, наверное, спрашивает о том как узнать какие процессы создали deadlock и на каком ресурсе.
О, подтянулись крупные специалисты по мертвым технологиям

Возвращаясь к теме
Именно на этот вопрос и ответит XML

ПРимер:

Code: Select all

- <EVENT_INSTANCE>
  <EventType>DEADLOCK_GRAPH</EventType> 
  <PostTime>2017-10-18T08:35:58.083</PostTime> 
  <SPID>20</SPID> 
- <TextData>
- <deadlock-list>
- <deadlock victim="process756bc8">
- <process-list>
- <process id="process756bc8" taskpriority="0" logused="0" waitresource="PAGE: 11:1:388407" waittime="22077" ownerId="2431733424" transactionname="INSERT" lasttranstarted="2017-10-18T08:35:35.980" XDES="0x1321e9b60" lockMode="S" schedulerid="8" kpid="13456" status="suspended" spid="133" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2017-10-18T08:35:35.980" lastbatchcompleted="2017-10-18T08:35:35.980" clientapp=".Net SqlClient Data Provider" hostname="хрю" hostpid="10624" loginname="хрю" isolationlevel="read committed (2)" xactid="2431733424" currentdb="11" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
- <executionStack>
  <frame procname="хрю.dbo.хрю" line="62" stmtstart="5552" stmtend="7852" sqlhandle="0x03000b003733966c817213000da800000100000000000000">insert @Result(EventID,RefEntityTypeID,RefClientID,SecID,LegalEntityID,CoraxEventID,CounterpartyID,RefEventActionID,RefEventStatusID,RefEventSourceID,CreateDate,ChangeDate,ChangedBy,Priority,EntityName,IsTicket) SELECT top(@ChunkRows4UpdateSecurity) e.EventID, e.RefEntityTypeID, e.RefClientID, s.SecID as SecID, null as LegalEntityID, e.CoraxEventID, e.CounterpartyID, e.RefEventActionID, e.RefEventStatusID, e.RefEventSourceID, e.CreateDate, e.ChangeDate, e.ChangedBy, e.Priority, s.Name as EntityName, CAST(CASE WHEN t.EventID IS NULL THEN 0 ELSE 1 END as bit) AS IsTicket FROM dbo.[Event] e INNER JOIN dbo.Sec s WITH(NOLOCK) on s.SecID = e.SecID LEFT OUTER JOIN SecStub t on t.EventID = e.EventID WHERE (t.EventID is null or (t.Vendor is null and t.RefTicketStatusID = 1)) AND e.RefEntityTypeID = 1 AND e.RefEventActionID = 2 AND e.RefEventStatusID = 1 and (e.RequestID is null or exists(select 1 from dbo.EventProcessingHistory eph where eph.R</frame> 
  </executionStack>
  <inputbuf>Proc [Database Id = 11 Object Id = 1821782839]</inputbuf> 
  </process>
- <process id="process708988" taskpriority="0" logused="110260" waitresource="PAGE: 11:1:95564" waittime="740" ownerId="2431729700" transactionname="user_transaction" lasttranstarted="2017-10-18T08:35:14.200" XDES="0x2f75e1970" lockMode="IX" schedulerid="5" kpid="6576" status="suspended" spid="92" sbid="0" ecid="0" priority="0" trancount="4" lastbatchstarted="2017-10-18T08:35:14.200" lastbatchcompleted="2017-10-18T08:35:14.200" clientapp=".Net SqlClient Data Provider" hostname="хрю" hostpid="10624" loginname="хрю" isolationlevel="read committed (2)" xactid="2431729700" currentdb="11" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
- <executionStack>
  <frame procname="SMGC.dbo.usp_populateEventByLegalEntityGC2GC" line="275" stmtstart="16924" stmtend="19732" sqlhandle="0x03000b003bd22a5a967313000da800000100000000000000">INSERT INTO dbo.Event ( RefEntityTypeID, SecID, CoraxEventID, CounterpartyID, LegalEntityID, RefEventActionID, RefEventStatusID, RefEventSourceID, ChangedBy, RefClientID, Priority, RequestID ) SELECT DISTINCT e.RefEntityTypeID, NULL, NULL, NULL, e.LegalEntityID, e.RefEventActionID, e.RefEventStatusID, e.RefEventSourceID, e.ChangedBy, e.RefClientID, 7, @RequestID FROM #EventLE e inner join dbo.LegalEntity le on le.LegalEntityID=e.LegalEntityID left join dbo.LegalEntityAuxCustomValues acvle on acvle.LegalEntityID=le.SecLeID_Parent LEFT JOIN dbo.Event AS t2 --WITH(NOLOCK) ON e.RefEntityTypeID= t2.RefEntityTypeID AND e.LegalEntityID=t2.LegalEntityID AND e.RefEventActionID= t2.RefEventActionID AND e.RefEventSourceID = t2.RefEventSourceID AND (@RequestID =t2.RequestID OR (@RequestID IS NULL AND t2.RequestID IS NULL AND e.RefEventStatusID = t2.RefEventStatusID)) WHERE (t2.LegalEntityID I</frame> 
  <frame procname="хрю" line="294" stmtstart="19566" stmtend="20454" sqlhandle="0x03000b001e931b26977313000da800000100000000000000">exec [dbo].[хрю] @AutoPost=@AutoPost, @RefClientID=@RefClientID, @RefSecTypeList=@RefSecTypeList, @RefInvestmentTypeList=@RefInvestmentTypeList, @SecIDList=@SecIDList, @SourceOnly=@SourceOnly, @NoCheckSourcePriority=@NoCheckSourcePriority, @AttributeID=@AttributeID, @RequestID=@RequestID, @IncludeInactive=@IncludeInactive, @RefEventSourceID=@RefEventSourceID, @ChangedBy=@ChangedBy</frame> 
  </executionStack>
  <inputbuf>Proc [Database Id = 11 Object Id = 639341342]</inputbuf> 
  </process>
  </process-list>
- <resource-list>
- <pagelock fileid="1" pageid="388407" dbid="11" objectname="хрю" id="lock112e31c00" mode="IX" associatedObjectId="72057602522611712">
- <owner-list>
  <owner id="process708988" mode="IX" /> 
  </owner-list>
- <waiter-list>
  <waiter id="process756bc8" mode="S" requestType="wait" /> 
  </waiter-list>
  </pagelock>
- <pagelock fileid="1" pageid="95564" dbid="11" objectname="хрю" id="lock332561580" mode="S" associatedObjectId="72057602522611712">
- <owner-list>
  <owner id="process756bc8" mode="S" /> 
  </owner-list>
- <waiter-list>
  <waiter id="process708988" mode="IX" requestType="wait" /> 
  </waiter-list>
  </pagelock>
  </resource-list>
  </deadlock>
  </deadlock-list>
  </TextData>
  <TransactionID /> 
  <LoginName>sa</LoginName> 
  <StartTime>2017-10-18T08:35:58.080</StartTime> 
  <ServerName>хрю</ServerName> 
  <LoginSid>AQ==</LoginSid> 
  <EventSequence>35828382</EventSequence> 
  <IsSystem>1</IsSystem> 
  <SessionLoginName /> 
  </EVENT_INSTANCE>
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

Dmitry67 wrote: 18 Oct 2017 12:22 ....

О, подтянулись крупные специалисты по мертвым технологиям

...
У нас, Дима, с тобой одинаковые технологии - реляционные базы данных.
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

Dmitry67 wrote: 18 Oct 2017 12:22 ...
Возвращаясь к теме
Именно на этот вопрос и ответит XML

А вот как это выглядит в DB2 for zOS (в системном журнале zOS):

Code: Select all

DSNT375I  -DB09 PLAN=P9GPASS WITH 135
        CORRELATION-ID=POOLPD240005
        CONNECTION-ID=AS7DNG1
        LUW-ID=NET.DB09LU.D34E3B9D560D=111241
        THREAD-INFO=KHANASHR:*:*:*
        IS DEADLOCKED WITH PLAN=P9GPASS WITH
        CORRELATION-ID=POOLPD200013
        CONNECTION-ID=AS7PNG2
        LUW-ID=NET.DB09LU.D34E3B9D1FF5=111236
        THREAD-INFO=WILLIAK:*:*:*
        ON MEMBER DB09
DSNT501I  -DB09 DSNILMCL RESOURCE UNAVAILABLE 136
           CORRELATION-ID=POOLPD240005
           CONNECTION-ID=AS7DNG1
           LUW-ID=NET.DB09LU.D34E3B9D560D=111241
           REASON 00C90088
           TYPE 00000304
           NAME AS09PDB .TISCASUM.X'001232' '.X'02'
Первое сообщение DSNT375I о том кто и кем был deadlock-ed. Второе, DSNT501T показывает имя ресурса, номер страницы и номер записи на ней.
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Как найти причину Deadlock в MS SQL

Post by iDesperado »

И все ? А граф дб2 экспортнуть может?
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

iDesperado wrote: 18 Oct 2017 16:30 И все ? А граф дб2 экспортнуть может?
О чем граф? Что еще нужно знать о deadlock кроме того что представленно в моем примере чтобы начать исправлять программу допускающую deadlock?
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Как найти причину Deadlock в MS SQL

Post by iDesperado »

zVlad wrote: 18 Oct 2017 16:41 О чем граф? Что еще нужно знать о deadlock кроме того что представленно в моем примере чтобы начать исправлять программу допускающую deadlock?
нужна базовая информация + граф. нужно имя и тип объекта (индекс, таблица, etc), тип блокировки, какойнить идентификатор типа rowid. в твоем примере нифига нет, ни имени таблицы, ни размер блокировки (row lock, page lock, table lock?). может в коде все хорошо, просто это тупой дб2 с крошечной памятью проэскалировал блокировку до page lock и тем самым вырубил транзакцию которая вообще не должна бы пересечься.
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

iDesperado wrote: 18 Oct 2017 18:18
zVlad wrote: 18 Oct 2017 16:41 О чем граф? Что еще нужно знать о deadlock кроме того что представленно в моем примере чтобы начать исправлять программу допускающую deadlock?
нужна базовая информация + граф. нужно имя и тип объекта (индекс, таблица, etc), тип блокировки, какойнить идентификатор типа rowid. в твоем примере нифига нет, ни имени таблицы, ни размер блокировки (row lock, page lock, table lock?). может в коде все хорошо, просто это тупой дб2 с крошечной памятью проэскалировал блокировку до page lock и тем самым вырубил транзакцию которая вообще не должна бы пересечься.
Все что ты перечислил все в моем примере есть.
Тебе тоже надо бы почитать учебники. Причина у deadlock одна, и устраняется она переписыванием программ.
Граф для этой ситуации ничем не помогает. Это все и без графа понять легко.
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Как найти причину Deadlock в MS SQL

Post by iDesperado »

zVlad wrote: 18 Oct 2017 19:22 Все что ты перечислил все в моем примере есть.
Тебе тоже надо бы почитать учебники. Причина у deadlock одна, и устраняется она переписыванием программ.
Граф для этой ситуации ничем не помогает. Это все и без графа понять легко.
Влад, уж не тебе оценивать мои знания. ты же это сам хорошо знаешь. еще раз, дб2 блокировочник, причем страдает эскалациями, причина может как в логике процедур, так и в ущербности движка дб2, который вынужден временами применять эскалацию блокировок. эскалация блокировок одна из причин дедлоков в дб2
https://www.ibm.com/support/knowledgece ... ation.html

Влад, ну признай, что никогда не работал с db2.
zVlad
Уже с Приветом
Posts: 15420
Joined: 30 Apr 2003 16:43
Has thanked: 1 time

Re: Как найти причину Deadlock в MS SQL

Post by zVlad »

iDesperado wrote: 18 Oct 2017 19:53
zVlad wrote: 18 Oct 2017 19:22 Все что ты перечислил все в моем примере есть.
Тебе тоже надо бы почитать учебники. Причина у deadlock одна, и устраняется она переписыванием программ.
Граф для этой ситуации ничем не помогает. Это все и без графа понять легко.
Влад, уж не тебе оценивать мои знания. ты же это сам хорошо знаешь. еще раз, дб2 блокировочник, причем страдает эскалациями, причина может как в логике процедур, так и в ущербности движка дб2, который вынужден временами применять эскалацию блокировок. эскалация блокировок одна из причин дедлоков в дб2
https://www.ibm.com/support/knowledgece ... ation.html

Влад, ну признай, что никогда не работал с db2.
Вообще то я привел пример диагностических сообщений чтобы показать как в DB2 диагностика связанная с deadlock выглядит.
Ты хочешь поговорить о влиянии эскалации на частоту deadlocks? Давай поговорим об этом. Но ты и из предложенной тобой ссылки понимаешь что DSNI031I позволяет исключить или подтвердить что конкретный deadlock мог быть спровоцирован конкретной эскалацией.
Т.е. говорить то здесь особо не о чем.
Единственное что могло бы быть интересным и полезным это поговорить о том как избежать deadlock в программах. Наверное это не тривиальная тема коль скоро проблема продолжает присутствовать во всех системах с блокировками, не только в базах данных.

P.S. Да конечно же, ты прав, я никогда не работал с DB2. Я вообще компьютеров в жизни не видал.
User avatar
ie
Уже с Приветом
Posts: 11019
Joined: 15 May 2002 02:09
Location: Boston, MA

Re: Как найти причину Deadlock в MS SQL

Post by ie »

Dmitry67 wrote: 12 Oct 2017 18:00 Получите deadlock graph, он в XML
так для этого надо трэйсер иметь постоянно включенным, так?
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Как найти причину Deadlock в MS SQL

Post by iDesperado »

zVlad wrote: 18 Oct 2017 20:52 Вообще то я привел пример диагностических сообщений чтобы показать как в DB2 диагностика связанная с deadlock выглядит.
Ты хочешь поговорить о влиянии эскалации на частоту deadlocks? Давай поговорим об этом. Но ты и из предложенной тобой ссылки понимаешь что DSNI031I позволяет исключить или подтвердить что конкретный deadlock мог быть спровоцирован конкретной эскалацией.
нет, не понимаю. я не вижу в сообщении ничего. я не вижу что было заблокировано - индекс, таблица или что еще. я не вижу что с чем столкнулось, был ли там row lock или page lock, может что еще. там ничего нет и понять дело в эскалации или логике по такому обрывку не возможно.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Как найти причину Deadlock в MS SQL

Post by Dmitry67 »

ie wrote: 18 Oct 2017 21:09
Dmitry67 wrote: 12 Oct 2017 18:00 Получите deadlock graph, он в XML
так для этого надо трэйсер иметь постоянно включенным, так?
Не обязательно
Можно подписаться на extended events и триггер будет получать инфу и сохранять куда хотите.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”