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

Откуда:
Сообщений: 27
Здравствуйте!
Возникает deadlock, мне не очень понятно, почему. Помогите пожалуйста разобраться в причинах.
Граф ожидания:
Deadlock encountered .... Printing deadlock information
2009-08-14 12:36:35.54 spid3     
2009-08-14 12:36:35.54 spid3     Wait-for graph
2009-08-14 12:36:35.54 spid3     
2009-08-14 12:36:35.54 spid3     Node:1
2009-08-14 12:36:35.54 spid3     TAB: 5:1214679425 []           CleanCnt:1 Mode: IX Flags: 0x0
2009-08-14 12:36:35.54 spid3      Grant List 0::
2009-08-14 12:36:35.54 spid3        Owner:0x19a3ad00 Mode: IS       Flg:0x0 Ref:1 Life:00000000 SPID:60 ECID:0
2009-08-14 12:36:35.54 spid3        SPID: 60 ECID: 0 Statement Type: SELECT Line #: 1
2009-08-14 12:36:35.54 spid3        Input Buf: Language Event: SELECT dev.*, (SELECT Description FROM t_States WHERE ID = dev.StateID) AS StateName FROM t_fDevices dev WHERE (NotUsed = 0 AND ParentDeviceID = 126)
2009-08-14 12:36:35.54 spid3      Grant List 1::
2009-08-14 12:36:35.54 spid3      Requested By: 
2009-08-14 12:36:35.54 spid3        ResType:LockOwner Stype:'OR' Mode: Schema-Mod SPID:51 ECID:0 Ec:(0x1B7C9568) Value:0x19a3d480 Cost:(0/120)
2009-08-14 12:36:35.54 spid3     
2009-08-14 12:36:35.54 spid3     Node:2
2009-08-14 12:36:35.54 spid3     KEY: 5:1214679425:1 (7200f4488d1f) CleanCnt:1 Mode: X Flags: 0x0
2009-08-14 12:36:35.54 spid3      Grant List 1::
2009-08-14 12:36:35.54 spid3        Owner:0x19a3d0c0 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:51 ECID:0
2009-08-14 12:36:35.54 spid3        SPID: 51 ECID: 0 Statement Type: ALTER TABLE Line #: 218
2009-08-14 12:36:35.54 spid3        Input Buf: RPC Event: dbo.AddHardwareEventByID;1
2009-08-14 12:36:35.54 spid3      Requested By: 
2009-08-14 12:36:35.54 spid3        ResType:LockOwner Stype:'OR' Mode: S SPID:60 ECID:0 Ec:(0x1C8CB560) Value:0x19a3ac40 Cost:(0/0)
2009-08-14 12:36:35.54 spid3     Victim Resource Owner:
2009-08-14 12:36:35.54 spid3      ResType:LockOwner Stype:'OR' Mode: S SPID:60 ECID:0 Ec:(0x1C8CB560) Value:0x19a3ac40 Cost:(0/0)

В AddHardwareEventByID начинается транзакция, выполняются какие-то действия над входными параметрами, затем делается ALTER TABLE чтобы отключить триггер на таблицу t_fDevices и в конце выполнения процедуры его включить. Видимо в принципе не очень правильно alter часто делать, но уж как сделано, уже работающая система.
18 авг 09, 10:30    [7549847]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
step_ks
Member

Откуда:
Сообщений: 936
Anna Romanova, видимо, все-таки, не совсем работающая. Убирайте эти извраты с альтерами.
18 авг 09, 19:10    [7553498]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Что-то у вас не то со схемой, раз триггеры отключать надо.
18 авг 09, 19:13    [7553510]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Анна, причины Вы уже сами сказали.
при селекте накладывается блокировка шарная. при альтере таблицы эта блокировка проверяется.
и альтер работает правильно. проверяет блокировки, и если есть, то ждет.
поэтому либо миритесь, либо меняйте работающую систему.

для спящего время бодрствования равносильно сну
18 авг 09, 19:33    [7553573]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

Откуда:
Сообщений: 27
Понятно, спасибо.
Только я не очень понимаю, select получается блокирует записи поочередно?
19 авг 09, 09:04    [7554426]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anna Romanova
Понятно, спасибо.
Только я не очень понимаю, select получается блокирует записи поочередно?

Блокировка записей тут не причем. Речь идет о блокировке таблицы.
19 авг 09, 10:31    [7554817]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

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

Объясните мне пожалуйста, не дойдет никак. Alter убираю, но понять все равно хочется.
Почему тогда возникает взаимоблокировка? Почему бы alter'у не дождаться, пока селект все выберет, а после этого уже делать свои грязные дела?
19 авг 09, 11:25    [7555193]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Anna Romanova
Glory,

Объясните мне пожалуйста, не дойдет никак. Alter убираю, но понять все равно хочется.
Почему тогда возникает взаимоблокировка? Почему бы alter'у не дождаться, пока селект все выберет, а после этого уже делать свои грязные дела?
Потому что alter никогда не дождется селекта, который в то же время ждет того, что заблокировал коннект, который пытается сделать alter.

Если вам уж совсем никак без отключения триггера, то делайте его в самом начале транзакции, буквально первой операцией.
19 авг 09, 11:33    [7555243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anna Romanova
Glory,

Объясните мне пожалуйста, не дойдет никак. Alter убираю, но понять все равно хочется.
Почему тогда возникает взаимоблокировка? Почему бы alter'у не дождаться, пока селект все выберет, а после этого уже делать свои грязные дела?

А что вы сделали, чтобы alter ждал то ?
Кроме того deadlock происходит в двух разных коннектах, а не в одном, как вы описываете
19 авг 09, 11:33    [7555250]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

Откуда:
Сообщений: 27
Гавриленко Сергей Алексеевич
Потому что alter никогда не дождется селекта, который в то же время ждет того, что заблокировал коннект, который пытается сделать alter.

А чего селект может ждать? Если я например в первом подключении начинаю транзакцию, изменяю строку, потом начинает работать второе подключение с селектом из этой же таблицы, а потом в первом пытаюсь сделать альтер?
Извините за возможно глупые вопросы.
19 авг 09, 12:11    [7555579]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Anna Romanova
Гавриленко Сергей Алексеевич
Потому что alter никогда не дождется селекта, который в то же время ждет того, что заблокировал коннект, который пытается сделать alter.

А чего селект может ждать? Если я например в первом подключении начинаю транзакцию, изменяю строку, потом начинает работать второе подключение с селектом из этой же таблицы, а потом в первом пытаюсь сделать альтер?
Извините за возможно глупые вопросы.

второй подключение при этом пытается ждать чегонить от первого при этом. например ту строку, которую изменили или таблицу.. мы же не знаем как вы ее изменяете..
19 авг 09, 12:12    [7555584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

Откуда:
Сообщений: 27
Алексей2003
второй подключение при этом пытается ждать чегонить от первого при этом. например ту строку, которую изменили или таблицу.. мы же не знаем как вы ее изменяете..


То есть обычный селект без хинтов будет ждать, пока завершится транзакция, в которой добавляются\изменяются записи в этой таблице(тоже без хинтов)? Или все-таки будет ждать, только если поставить какой-нибудь tablockx например в update?
19 авг 09, 12:35    [7555706]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ну вообщето есть блокировка не только записи или таблицы. есть еще другие блокирови.
но воздух сотрясать можно долго и упорно. пока что всей необходимой информацией располагаете только Вы.

для спящего время бодрствования равносильно сну
19 авг 09, 12:40    [7555740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anna Romanova
Алексей2003
второй подключение при этом пытается ждать чегонить от первого при этом. например ту строку, которую изменили или таблицу.. мы же не знаем как вы ее изменяете..


То есть обычный селект без хинтов будет ждать, пока завершится транзакция, в которой добавляются\изменяются записи в этой таблице(тоже без хинтов)? Или все-таки будет ждать, только если поставить какой-нибудь tablockx например в update?

Все запросы ждут ресурсов, которые им нужны. А не вообще ждут чего-то
И транзакция в одном коннекте не обязательно блокирует ресурсы, которые нужны в другом коннекте.

Для того, чтобы узнать, что заблокировал ваш конкретный запрос, нужно использовать средств мониторинга. Хотите ЕМ, хотите процедуру sp_lock, хотите обращайтесь к системным таблицам, хотите Профайлер

Для того, чтобы узнать, ожидает ли другой запрос заблокированных ресурсов, используют теже средства мониторинга.
19 авг 09, 12:46    [7555777]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

Откуда:
Сообщений: 27
Алексей2003
ну вообщето есть блокировка не только записи или таблицы. есть еще другие блокирови.
но воздух сотрясать можно долго и упорно. пока что всей необходимой информацией располагаете только Вы.

для спящего время бодрствования равносильно сну

Да это понятно.
Этой всей информации слишком много, поэтому и не выкладываю...И сделано далеко не все грамотно, но уж что досталось, с тем и работаю...

Спасибо всем, убираю для начала альтеры, а там посмотрим.
19 авг 09, 14:01    [7556384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Anna Romanova
Member

Откуда:
Сообщений: 27
Glory
Все запросы ждут ресурсов, которые им нужны. А не вообще ждут чего-то
И транзакция в одном коннекте не обязательно блокирует ресурсы, которые нужны в другом коннекте.

Для того, чтобы узнать, что заблокировал ваш конкретный запрос, нужно использовать средств мониторинга. Хотите ЕМ, хотите процедуру sp_lock, хотите обращайтесь к системным таблицам, хотите Профайлер

Для того, чтобы узнать, ожидает ли другой запрос заблокированных ресурсов, используют теже средства мониторинга.


Я это осознаю. Просто мне не очень понятен наверное порядок наложения блокировок при чтении. То есть если выполняется селект, как получается так, что он начал читать, но не закончил, потому что кто-то впихнулся и наложил на что-то блокировку, не совместимую с s?

Про средства мониторинга спасибо, я попробую. Ситуация осложняется тем, что я пока не знаю, как такую ситуацию сделать специально. Дедлок не очень часто возникает.
19 авг 09, 14:32    [7556633]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock'ом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
прочитайте про deadlock и в каких случаях он возникает.

для спящего время бодрствования равносильно сну
19 авг 09, 14:49    [7556776]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить