Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
Здравствуйте! Помогите советом. Заранее прошу давать исчерпывающие ответы, так как я не профессионал и многое очевидное для Вас, для меня вовсе не очевидно.

Есть интенсивно используемая процедура с транзакцией. Запускаются практически параллельно, с разницей в несколько миллисекунд, возникают deadlock'и. Возникают при превышении некоторого порога ~ 300 запусков в минуту.

А проблема то собственно в том, что причин для возникновения deadlock'ов то и нет. Каждый запущенный экемпляр процедуры работает со своими строками, определяемыми входными параметрами. Я хочу сказать, что в один момент времени двух параллельно выполняемых процедур работающих с одними и теми же строками нет. Операции в процедуре - по большей части update, в гораздо меньшей степени происходит insert.

При обновлении, в любой части процедуры я сначала получаю RowID записи которую необходимо обновлять и обновляю именно по нему, то есть блокируется только конкретные строки и не пересекаются между запущенными экземплярами процедуры. Селект везде выполняется с nolock (наличие грязных данных здесь не смущает), т.е. также не может стать причиной deadlock'ов.

По сути процедура - это набор вот таких вот блоков кода:

...
set @RowID = (select RowID from spapi_ScoreMonthly with (nolock) 
  where (GSCommId=@GS or GameID=@_gameID) 
  AND UserId=@InnerUserID 
  AND datediff(day, @DateOfResult, getdate())=0 
  AND Score<@Score
  )

update spapi_ScoreMonthly set Score=@Score, AddDate=@DateOfResult where RowID=@RowID
if @@error <> 0
begin
  set @ResultCode = @@error
  goto Cleanup	
end
...

Также вопросы:

1. Как просмотреть граф deadlock'ов?
2. Существенное ли влияние оказывает использование Express версии сервера (2005)?
14 июл 09, 19:33    [7415831]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
афигеть, по сути это набор блоков. а сколько таких блоков есть в процедуре?

чтобы просить исчерпывающие ответы, надо для начала почитать правила форуме, чтобы иметь наглость такое написать.

читайте про уровни изоляции запросов, nolock уже научились рисовать.

для спящего время бодрствования равносильно сну
14 июл 09, 19:37    [7415848]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

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

Вот за информацию про уровни изоляции - спасибо, разбираюсь.
14 июл 09, 19:43    [7415869]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

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


А в чём собственно наглость и некорректность моего вопроса, объясните пожалуйста, чтобы более такого небыло
14 июл 09, 19:47    [7415879]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
тынц
п.1 и п.2 читали?

для спящего время бодрствования равносильно сну
14 июл 09, 19:49    [7415887]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
граф дедлока давай. все ясно будет
14 июл 09, 19:55    [7415898]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
Crimean, с удовольствием и сам на него взгляну, но непонимаю как и где на него можно посмотреть?

флаг 1204 поставил, в логе информация об этом есть, но сообщений о deadlock'ах нет
14 июл 09, 20:05    [7415916]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
DBCC TRACEON(1204, -1)
DBCC TRACEON(3604, -1)
DBCC TRACEON(3605, -1)

или в профилере
14 июл 09, 20:20    [7415964]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2Crimean
Express edition имеет ограничения на профилер.. вот на счет DBCC TRACEON не в курсе..

для спящего время бодрствования равносильно сну
14 июл 09, 20:27    [7415986]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
с 2005 - включить RCSI и убрать NOLOCK для начала :)
если дедлоки будут на S-X на апдейтах - прописать хинты
14 июл 09, 20:35    [7416009]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
спасибо

убрал Nolock, сделал:
SET READ_COMMITTED_SNAPSHOT ON
SET ALLOW_SNAPSHOT_ISOLATION

и
SET TRANSACTION ISOLATION LEVEL SNAPSHOT в процедуре

слежу за работой, появилось обнадёживающее чувство
15 июл 09, 14:25    [7418973]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
> убрал Nolock, сделал:
> SET READ_COMMITTED_SNAPSHOT ON

было бы достаточно

> SET ALLOW_SNAPSHOT_ISOLATION
> SET TRANSACTION ISOLATION LEVEL SNAPSHOT в процедуре

занадто совершенно. эко вас колбасит
15 июл 09, 18:07    [7420718]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
дедлоки есть..

> SET ALLOW_SNAPSHOT_ISOLATION
> SET TRANSACTION ISOLATION LEVEL SNAPSHOT в процедуре

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

Теперь только RCSI. Слежу за работой дальше
15 июл 09, 18:18    [7420790]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

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

ещё вы пишите про хинты, что-то я немогу понять, что это такое и какую пользу может мне принести?)
15 июл 09, 18:20    [7420801]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
в SQL Server терминологии хинт указывается при выборке из таблиц, в вашем первом случае nolock.

для спящего время бодрствования равносильно сну
15 июл 09, 19:08    [7420986]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
граф покажи
15 июл 09, 21:39    [7421332]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

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

Ну уже несколько часов работает без дедлоков) Завтра новый день, в первой половине дня будет большая нагрузка и посмотрим..
15 июл 09, 23:22    [7421503]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
и снова deadlock'и. Граф:

07/16/2009 10:53:31,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x157EDB58 Mode: U SPID:70 BatchID:0 ECID:0 TaskProxy:(0x1569E378) Value:0x39e27c0 Cost:(0/0)
07/16/2009 10:53:31,spid4s,Unknown,Victim Resource Owner:
07/16/2009 10:53:31,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/16/2009 10:53:31,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x178DB8D0 Mode: U SPID:69 BatchID:0 ECID:0 TaskProxy:(0x13F6E378) Value:0x39e24e0 Cost:(0/244)
07/16/2009 10:53:31,spid4s,Unknown,Requested By:
07/16/2009 10:53:31,spid4s,Unknown,Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 414624520]
07/16/2009 10:53:31,spid4s,Unknown,SPID: 57 ECID: 0 Statement Type: UPDATE Line #: 216
07/16/2009 10:53:31,spid4s,Unknown,Owner:0x039E1F40 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:57 ECID:0 XactLockInfo: 0x178DA814
07/16/2009 10:53:31,spid4s,Unknown,Grant List 0:
07/16/2009 10:53:31,spid4s,Unknown,RID: 5:1:217114:90             CleanCnt:2 Mode:X Flags: 0x2
07/16/2009 10:53:31,spid4s,Unknown,Node:3
07/16/2009 10:53:31,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/16/2009 10:53:31,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x157EDB58 Mode: U SPID:70 BatchID:0 ECID:0 TaskProxy:(0x1569E378) Value:0x39e27c0 Cost:(0/0)
07/16/2009 10:53:31,spid4s,Unknown,Requested By:
07/16/2009 10:53:31,spid4s,Unknown,Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 414624520]
07/16/2009 10:53:31,spid4s,Unknown,SPID: 69 ECID: 0 Statement Type: UPDATE Line #: 148
07/16/2009 10:53:31,spid4s,Unknown,Owner:0x039E24C0 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:69 ECID:0 XactLockInfo: 0x178DB8F4
07/16/2009 10:53:31,spid4s,Unknown,Grant List 0:
07/16/2009 10:53:31,spid4s,Unknown,RID: 5:1:211731:77             CleanCnt:4 Mode:X Flags: 0x2
07/16/2009 10:53:31,spid4s,Unknown,Node:2
07/16/2009 10:53:31,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/16/2009 10:53:31,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x178DA7F0 Mode: U SPID:57 BatchID:0 ECID:0 TaskProxy:(0x04124378) Value:0x39e3520 Cost:(0/524)
07/16/2009 10:53:31,spid4s,Unknown,Requested By:
07/16/2009 10:53:31,spid4s,Unknown,Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 414624520]
07/16/2009 10:53:31,spid4s,Unknown,SPID: 70 ECID: 0 Statement Type: UPDATE Line #: 148
07/16/2009 10:53:31,spid4s,Unknown,Owner:0x039E27C0 Mode: U        Flg:0x2 Ref:1 Life:00000000 SPID:70 ECID:0 XactLockInfo: 0x157EDB7C
07/16/2009 10:53:31,spid4s,Unknown,Wait List:
07/16/2009 10:53:31,spid4s,Unknown,RID: 5:1:211731:77             CleanCnt:4 Mode:X Flags: 0x2
07/16/2009 10:53:31,spid4s,Unknown,Node:1
07/16/2009 10:53:31,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/16/2009 10:53:31,spid4s,Unknown,Wait-for graph
07/16/2009 10:53:31,spid4s,Unknown,Deadlock encountered .... Printing deadlock information


А вот, на всякий случай то, что было до включения RCSI

07/15/2009 10:35:18,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x0A81E958 Mode: S SPID:53 BatchID:0 ECID:0 TaskProxy:(0x06898378) Value:0x39e47e0 Cost:(0/344)
07/15/2009 10:35:18,spid4s,Unknown,Victim Resource Owner:
07/15/2009 10:35:18,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/15/2009 10:35:18,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x0A81E958 Mode: S SPID:53 BatchID:0 ECID:0 TaskProxy:(0x06898378) Value:0x39e47e0 Cost:(0/344)
07/15/2009 10:35:18,spid4s,Unknown,Requested By:
07/15/2009 10:35:18,spid4s,Unknown,Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 670625432]
07/15/2009 10:35:18,spid4s,Unknown,SPID: 55 ECID: 0 Statement Type: SELECT Line #: 248
07/15/2009 10:35:18,spid4s,Unknown,Owner:0x039E4C60 Mode: IX       Flg:0x0 Ref:0 Life:02000000 SPID:55 ECID:0 XactLockInfo: 0x0A81F4BC
07/15/2009 10:35:18,spid4s,Unknown,Grant List 0:
07/15/2009 10:35:18,spid4s,Unknown,PAGE: 5:1:257645               CleanCnt:4 Mode:IX Flags: 0x2
07/15/2009 10:35:18,spid4s,Unknown,Node:2
07/15/2009 10:35:18,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/15/2009 10:35:18,spid4s,Unknown,ResType:LockOwner Stype:'OR'Xdes:0x0A81F498 Mode: S SPID:55 BatchID:0 ECID:0 TaskProxy:(0x095C2378) Value:0x39e4d80 Cost:(0/352)
07/15/2009 10:35:18,spid4s,Unknown,Requested By:
07/15/2009 10:35:18,spid4s,Unknown,Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 670625432]
07/15/2009 10:35:18,spid4s,Unknown,SPID: 53 ECID: 0 Statement Type: SELECT Line #: 248
07/15/2009 10:35:18,spid4s,Unknown,Owner:0x039E4440 Mode: IX       Flg:0x0 Ref:0 Life:02000000 SPID:53 ECID:0 XactLockInfo: 0x0A81E97C
07/15/2009 10:35:18,spid4s,Unknown,Grant List 0:
07/15/2009 10:35:18,spid4s,Unknown,PAGE: 5:1:257645               CleanCnt:4 Mode:IX Flags: 0x2
07/15/2009 10:35:18,spid4s,Unknown,Node:1
07/15/2009 10:35:18,spid4s,Unknown,Log Viewer could not read information for this log entry. Cause: Data is Null. This method or property cannot be called on Null values.. Content:
07/15/2009 10:35:18,spid4s,Unknown,Wait-for graph
07/15/2009 10:35:18,spid4s,Unknown,Deadlock encountered .... Printing deadlock information
16 июл 09, 14:10    [7424074]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
У вас идет банальня драка за страницы без RCSI и за строки с RCSI.
Хинтами и игрой уровнями изоляции вам тут только поможет, ИМХО, монопольная блокировка объектов, что не есть большой гуд при параллельной работе.
Индексы не пробовали создавать?
16 июл 09, 14:26    [7424207]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

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

Спасибо. Но вот я плохо понимаю сказанное. Всё-таки что и чем блокируется? В моей голове вообще не укладывается откуда здесь могут быть deadlock'и, особенно если вернуться к with (nolock), то есть что мне говорит второй приведённый граф?

А если мне вообще избавиться от select'ов внутри транзакции, сделать все необходимые подсчёты до начала транзакции, а в транзакции только обновить таблицы, это может исправить проблему? Или я корень проблемы понимаю не правильно?
16 июл 09, 15:06    [7424520]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
ещё отмечу, что параллельно с этой процедурой часто (даже я бы сказал сверх-часто) вызывается ещё одна процедура, в которой делаются только селекты из этих таблиц, селекты с with(nolock). Оказывает ли влияние эта вторая процедура, на мою проблемную процедуру?
16 июл 09, 15:11    [7424548]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Алексей lemix М.
ещё отмечу, что параллельно с этой процедурой часто (даже я бы сказал сверх-часто) вызывается ещё одна процедура, в которой делаются только селекты из этих таблиц, селекты с with(nolock). Оказывает ли влияние эта вторая процедура, на мою проблемную процедуру?


Раз Вы включили версионность, то читатели не будут мешать писателям и наоборот. Так что NOLOCK выбрасывайте. Прислушайтесь к совету о создании индексов, дабы уйти от RID локов. И, проверьте, чтобы в процедурах изменение таблиц шло в одинаковом порядке.
16 июл 09, 15:14    [7424556]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Алексей lemix М.
Member

Откуда:
Сообщений: 20
индекс по полю RowID? Оно и так имеет тип Index.

монопольная блокировка - не вариант, даже как временное решение.
16 июл 09, 15:46    [7424852]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Алексей lemix М.
индекс по полю RowID? Оно и так имеет тип Index.


по какому полю - надо смотреть план запроса. Ибо раз идет лок по ROWID, значит индекс не используется.
16 июл 09, 15:56    [7424950]     Ответить | Цитировать Сообщить модератору
 Re: deadlock "без причин?"  [new]
Crimean
Member

Откуда:
Сообщений: 13148
и дайте граф из ERRORLOG, а не из студии, да еще и непонятно как отсортированный!
16 июл 09, 21:40    [7426474]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить