Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

MS SQL deadlock   Найти похожие ветки 

 
ProstoTak ©   (2014-10-03 15:21) [0]

В программе, которая цепляется к MS SQL Server 2005 через ADO выдается:

Transaction was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

http://goo.gl/FZcqHk

В мониторе активности для данного процесса стоит: "exec MyProc 1, 0, 0, 0"

MyProc это простая процедура, которая делает SELECT с несколькими джойнами

PROCEDURE MyProc(@flag1 bit, @flag2 bit, @flag3 bit, @flag4 bit)
AS
BEGIN
   SELECT ...
   FROM tblClaim a
 INNER JOIN ...
  ON ...
 LEFT JOIN ...
  ON ...
 LEFT JOIN ...
  ON ...
WHERE (x.y = @flag1) ... AND ...
ORDER BY zzz DESC
END


Собственно, и все. Отчего может возникать дедлок?!

Возникает очень редко, но бывает. Причем если начинает возникать - то массово. А потом пропадет.


 
junglecat ©   (2014-10-03 15:30) [1]

а кто-то может параллельно обновлять участвующие таблицы? или читать с блокировкой?
попробуй
SELECT ...
FROM tblClaim a WITH (NOLOCK)

ну и в джойнах тоже добавь WITH (NOLOCK)


 
ProstoTak ©   (2014-10-03 15:31) [2]


> а кто-то может параллельно обновлять участвующие таблицы?

может. Но ведь программа должна зависнуть в ожидании окончания разблокировки.

Как select может выдать дедлок?


 
junglecat ©   (2014-10-03 15:44) [3]

> Как select может выдать дедлок?

если уровень изоляции read commited, то запросто

процесс А селект из таб А джойн Б - залочили страницу
процесс Х апдейт таблицы Б джойн А - вдруг по условию залочили ту же страницу, ждем А, а А в это время ждет Б.
Дед Лок пришел.


 
ProstoTak ©   (2014-10-03 16:30) [4]


> процесс Х апдейт таблицы Б джойн А

это как?


 
junglecat ©   (2014-10-03 17:22) [5]

http://technet.microsoft.com/ru-ru/library/ms178104(v=sql.105).aspx


 
ВладОшин ©   (2014-10-03 18:15) [6]

померяйте пинг до сервера в такие ситуации
есть подозрение..
сообщите, плз, резулт :)


 
ProstoTak ©   (2014-10-03 18:31) [7]


> http://technet.microsoft.com/ru-ru/library/ms178104(v=sql.
> 105).aspx

я это читал. Я не понял как можно апдейтить с джойном.


> есть подозрение..

озвучь? Просто проблема крайне плавающая, быстро сама по себе исчезающая, поэтому сложно что-то анализировать :(


 
Кщд ©   (2014-10-03 18:32) [8]

>junglecat ©   (03.10.14 15:30) [1]
dirty reads - плохо-плохой совет


 
Кщд ©   (2014-10-03 18:36) [9]

>ProstoTak ©   (03.10.14 18:31) [7]
>я это читал. Я не понял как можно апдейтить с джойном.
просто:
1. определить запросы, вызывающие deadlock (трассировка);
2. скорректировать подход к работе с данными (почитать про блокировочники и best practice).


 
ВладОшин ©   (2014-10-03 18:40) [10]

да что озвучивать..
как только у MSSQL возникают проблемы с коннектом, начинаются такие ошибки

т.е. или сисадмин что-то должен выставить или надо принять как данность и
сидеть на стуле прямо, обрабатывая ошибки

вопрос или у меня так(как только у MSSQL возникают проблемы с коннектом, начинаются такие ошибки) или у всех


 
ВладОшин ©   (2014-10-03 18:42) [11]

причем в программе ничего не менялось, а ошибки то есть то нет
сплошь  рядом, есть такое, да
по наблиюдениям именно  от скорсоти ответа зависит.


 
Кщд ©   (2014-10-03 20:44) [12]

>ВладОшин ©   (03.10.14 18:42) [11]
зачем гадать?
трассируйте


 
ВладОшин ©   (2014-10-03 20:55) [13]


> Кщд ©   (03.10.14 20:44) [12]

да я бы рад, но сейчас нет таких проблем.

было два дня назад, ночью
спал тогда :)

там у меня execept.. end - и заново, если что (ну, что бы хоть что-то делалаось)
когда в след.раз будет - неизвестно.

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


 
ВладОшин ©   (2014-10-03 21:01) [14]

тогда зачем написано

> сплошь  рядом, есть такое, да


неправильно тогда написано.
уточнение - Было пару раз, подозреваю пропорциональность ответу

в принципе, можно,завтра проэмулировать
через какой нить китайский, потом индийский, потом .. ский проксий прокси добиться ответа в 30-40 секунд и проверить..


Попробуем :)

спасибо :)


 
turbouser ©   (2014-10-03 22:58) [15]


> ВладОшин ©   (03.10.14 18:40) [10]
>
> да что озвучивать..
> как только у MSSQL возникают проблемы с коннектом, начинаются
> такие ошибки

Что-то в консерватории не так


 
ProstoTak ©   (2014-10-04 13:02) [16]


> просто

что просто? Камрад junglecat написал:


> процесс Х апдейт таблицы Б джойн А

у меня вопрос - как можно апдейтить с джойном.

А более крупный вопрос - как SELECT может вызывать deadlock.


 
junglecat ©   (2014-10-04 13:27) [17]

> как SELECT может вызывать deadlock.

сам по себе селект нет. Но он выбирается жертвой дедлока как наименее приоритетная транзакция, поскольку не обновляет данные


 
junglecat ©   (2014-10-04 13:58) [18]

https://www.simple-talk.com/sql/performance/sql-server-deadlocks-by-example/


 
turbouser ©   (2014-10-04 16:44) [19]


> junglecat ©   (04.10.14 13:27) [17]


> сам по себе селект нет. Но он выбирается жертвой

КО

> ProstoTak ©

а кто headblocker в таких ситуациях?


 
junglecat ©   (2014-10-04 17:29) [20]

> [0] ProstoTak ©   (03.10.14 15:21)

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


 
ProstoTak ©   (2014-10-04 22:58) [21]


> сам по себе селект нет. Но он выбирается жертвой дедлока
> как наименее приоритетная транзакция

ничего не понимаю. Если select наталкивается на блокировку - он просто будет ЖДАТЬ окончания модификации данных.

Каким образом он может привести к дедлоку?


 
junglecat ©   (2014-10-04 23:29) [22]

> Каким образом он может привести к дедлоку?

например, селекту нужны 2 индекса для покрытия запроса, и параллельному апдейту тоже нужны эти же 2 индекса. Здесь они и могут упереться рогом.
или вот
http://blogs.msdn.com/b/bartd/archive/2006/09/25/deadlock-troubleshooting-part-3.aspx


 
ВладОшин ©   (2014-10-04 23:39) [23]


> Каким образом он может привести к дедлоку?

  SELECT ...
  FROM tblClaim a
  INNER JOIN tblInfo

время t
процесс_X1 в рамках транзакции Т1 залочил под апдейт tblClaim

время t +1
процесс_Select в рамках транзакции Т2 встал в очередь лочить

время t +2
процесс_X1 в рамках транзакции Т1 захотел залочить tblInfo, но процесс_Select уже ее залочил и ждет освобождения

Т1 не может закончить транзакцию из-за процесс_Select
процесс_Select  не может начать из-за Т1

если  процесс_Select
>> если уровень изоляции read commited,

можно попробовать  дописать WITH (NOLOCK) за каждой таблой, если не важно гарантированность согласования
или установить соотв уровень через  set transaction

-------------
PS
а мое подозрение на долгий отклик походу ни при чем, не воспроизвелось
------

проверьте еще триггеры, про эти штуки можно забыть, а они что-то делают - и попадос

Спросите причастных, не добавили ли они что недавно. Админ что-то подкрутил, например, другой программер изменил свою какую процедуру по этим же таблам..



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.054 c
15-1413646158
tomkat
2014-10-18 19:29
2015.09.10
не запускается Delphi


15-1413052531
wl
2014-10-11 22:35
2015.09.10
Опасное электричество


15-1418679002
Юрий
2014-12-16 00:30
2015.09.10
С днем рождения ! 16 декабря 2014 вторник


15-1416493349
aka
2014-11-20 17:22
2015.09.10
поворот отрезка


15-1412620344
kriss
2014-10-06 22:32
2015.09.10
FireMonkey