ну то есть если у вас сложная система, с множеством програмистов, решения практически нет?zVlad wrote: ↑19 Oct 2017 14:46Хороший и даже ключевой в этой ситуации вопрос. Я в течении последних 17+ лет работы пытался донести до наших програмистов идею как с этим бороться несчетное количество раз. Последний раз это было совсем недавно, не более недели назад.ie wrote: ↑19 Oct 2017 14:07zVlad wrote:Влад и Дима, допустим мы нашли таблицу и пару stored-proc, которые создают дэдлок.Dmitry67 wrote:
допустим это случается once in a blue moon, тоесть программы и db работают в основном нармально.
теперь что мы будем делать? хотелось бы узнать ваш подход к решению проблемы.
ну понятно что можно валить все на разработчиков фронт-энд которые пишут кривой sql.
но с другой стороны в 99% случаев их sql работает... такшта... кто виновать? и что делать?
Вспомним, для начала, что ж такое deadlock. Один пользователь локает ресурс r1 и держит, второй локает r2 и держит. Первый хочет залокать r2 - ждет, a второй просит lock на r1. Второго система выкидывает, давая первому закончить хотя бы его транзакцию.
Вариант решения проблемы #1: локать r1, и r2 одновременно, сразу. Но, как я понимаю, не все алгоритмы и логика выполнения могут определить сразу что понадобится ресурс r2.
Вариант решения проблемы #2: локать все таблицы нужные транзакции полностью и сразу. Тут есть неочевидные плюсы и минусы. Это может работать но явно снизут уровень параллельногоо выполнения множества транзакции. Из плюсов - меньше возни с locks, т.е. меньше накладных расходов. Идеальный, тем не менее, вариант в случае одного CPU "бесконечной" мощности, т.е. такой что любая транзакция выполняется "мгновенно".
Третий (наиболее реалистичный, простой, понятный) вариант #3: Програма распознает что оказалась жертвой deadlock и повторяет попытку.
Как найти причину Deadlock в MS SQL
-
- Уже с Приветом
- Posts: 11019
- Joined: 15 May 2002 02:09
- Location: Boston, MA
Re: Как найти причину Deadlock в MS SQL
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Решение проблемы #4: Залокав r1 и обнаружих потребность в ресурсе r2 программа отпускает ресурс r1 и локает ресурсы r1 и r2 одновременно.
Наверняка есть и дриугие подходы. Я никогда не боролся с проблемой deadlock в своих программах поскольку мои программы однопользовательские.
Прикрываются мифической сложностью те, по моему глубокому убеждению, кто не умеет писать эти самые сложные системы, т.е. не умеет управлять проблемами сложных систем. Пишет как получится, а потом блеет о сложности систем. Не обижайтесь, это я не о Вас лично, а так вообще.
-
- Уже с Приветом
- Posts: 11019
- Joined: 15 May 2002 02:09
- Location: Boston, MA
Re: Как найти причину Deadlock в MS SQL
как вы можете рассуждать о том что кто-то "прикрывается" если у вас нет опыта написания многопользовательских программ?zVlad wrote: ↑19 Oct 2017 15:26Решение проблемы #4: Залокав r1 и обнаружих потребность в ресурсе r2 программа отпускает ресурс r1 и локает ресурсы r1 и r2 одновременно.
Наверняка есть и дриугие подходы. Я никогда не боролся с проблемой deadlock в своих программах поскольку мои программы однопользовательские.
Прикрываются мифической сложностью те, по моему глубокому убеждению, кто не умеет писать эти самые сложные системы, т.е. не умеет управлять проблемами сложных систем. Пишет как получится, а потом блеет о сложности систем. Не обижайтесь, это я не о Вас лично, а так вообще.
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Рассуждать всегда можно. Тем более если есть что предложить, как это я показал. Мои программы возможно и будут работать в многопользовательском варианте - я не проверял, поскольку писал их для себя, для DBA и zOS system programmer, который умеет програмировать и делает это чтобы сократить ручную работу или там где обьем работы не посволяет обойтись ручным управлением.ie wrote: ↑19 Oct 2017 15:30как вы можете рассуждать о том что кто-то "прикрывается" если у вас нет опыта написания многопользовательских программ?zVlad wrote: ↑19 Oct 2017 15:26Решение проблемы #4: Залокав r1 и обнаружих потребность в ресурсе r2 программа отпускает ресурс r1 и локает ресурсы r1 и r2 одновременно.
Наверняка есть и дриугие подходы. Я никогда не боролся с проблемой deadlock в своих программах поскольку мои программы однопользовательские.
Прикрываются мифической сложностью те, по моему глубокому убеждению, кто не умеет писать эти самые сложные системы, т.е. не умеет управлять проблемами сложных систем. Пишет как получится, а потом блеет о сложности систем. Не обижайтесь, это я не о Вас лично, а так вообще.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
Как ни странно я в общем совершенно согласен с zVlad. Действительно, правильный (и одинаковый) порядок модификации таблиц, Однако это примерно как сказать 'если все будут ездить по правилам, то аварий не будет'. Правильно, но бесполезно. Реально объектно ориентированные системы делают все в удобном им порядке, а если есть ORM, то вообще туши свет.zVlad wrote: ↑19 Oct 2017 14:46 Вариант решения проблемы #1: локать r1, и r2 одновременно, сразу. Но, как я понимаю, не все алгоритмы и логика выполнения могут определить сразу что понадобится ресурс r2.
Вариант решения проблемы #2: локать все таблицы нужные транзакции полностью и сразу. Тут есть неочевидные плюсы и минусы. Это может работать но явно снизут уровень параллельногоо выполнения множества транзакции. Из плюсов - меньше возни с locks, т.е. меньше накладных расходов. Идеальный, тем не менее, вариант в случае одного CPU "бесконечной" мощности, т.е. такой что любая транзакция выполняется "мгновенно".
Третий (наиболее реалистичный, простой, понятный) вариант #3: Програма распознает что оказалась жертвой deadlock и повторяет попытку.
P.S. Есть еще вариант решения (полагаю и не один, но один знаю точно). Расскажу после прогулки.
Однако есть еще один путь - очень часто процессы пересекаются по данным не напрямую, а косвенно. Поясню, что я имею в виду. Пусть вы выполняете
update TAB set N=N+1 where A=111 and B=222
Причем индекс есть только по A. Тогда SQL читает (если это эффективно) данные по индексу A и далее фильтрует по условию B=222. При этом данные с B<>222 также оказываются прочитанными и заблокированными. Это не баг, это важно для consistency. Соотвественно, вы можете словить блокировку или дедлок по данным которые даже не меняли (B<>222). Индекс по A,B накладывает RANGE LOCK по A,B сразу и не касается данных которе вы не трогаете
Иногда, при низкой селективности индекса SQL может предпочесть SCAN. Это может оказаться быстрее но... повысит вероятность блокировки. В этом случае может иметь смысл немного поступиться произодительностью, зафорсив использование индекса.
Можно только добавить, что в MS SQL есть еще возможность поиграться snapshot isolation level.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Как найти причину Deadlock в MS SQL
т.е. мне предлагается угадывать индекс то был или таблица, shared lock или exclusive. допустим известно что второй пытался row level лок поставить, но в чем причина дедлока мне угадывать ? с чем его блокировка оказалась не совместима ? с table lock первого ? page lock ? может как и у первого row lock. у вас там субд или конкурс угадайка ?zVlad wrote: ↑19 Oct 2017 14:05 Ну вы, ребята, даете. Читать сообщения на нормальном английском языке разучились со своими xml и графами.
В первом сообщении дает два набора данных о столкнувшихся юзерах соединеных "IS DEADLOCKED WITH..", в переводе на русский первый был выбран жертвой дэдлока вторым.
Второе сообщение начинается словами "RESOURCE UNAVAILABLE", и в конце сообще с ключевым словом "NAME =" идет имя ресурса. В имени есть два шестнадцетиричных значения, первое это страница, второе это номер записи на ней. Поскольку есть номер записи то это row level locking.
по факту в сообщении нет и половины необходимой инфы, что бы сделать хотя бы предварительные выводы.
-
- Уже с Приветом
- Posts: 1494
- Joined: 08 Mar 2002 10:01
- Location: NJ
Re: Как найти причину Deadlock в MS SQL
Для дедлоков есть простое решение: все агенты должны обращаться к ресурсам в одном и том же порядке. Если один тред обращается к переменным в порядке A,B, то другой тоже должен обращаться в порядке A,B. Если B,A то возможен дедлок.
В db2 есть монитор для дедлоков, который дает исчерпывающую информацию, хоть в таблицах, хоть в XML.
В db2 есть монитор для дедлоков, который дает исчерпывающую информацию, хоть в таблицах, хоть в XML.
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Вынужден огорчить ребят которые страдают от index locks. В DB2 начиная с версии 4.1 (это очень давно было) индексы не локируются. Можете, например, здесь почитать:
http://www.anesi.com/v41201.htm
iDespirado, не истери. Просто подумай и все поймешь сам. Удачи. Я поехал в лес по грибы. Продолжим вечером, а может раньше если грибов не будет.
http://www.anesi.com/v41201.htm
iDespirado, не истери. Просто подумай и все поймешь сам. Удачи. Я поехал в лес по грибы. Продолжим вечером, а может раньше если грибов не будет.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
Как я уже говорил, это абсолютно верный и абсолютно бесполезный совет
Вы на воздушном шаре, сэр!
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1316
- Joined: 27 Dec 2004 05:07
- Location: SFBA
Re: Как найти причину Deadlock в MS SQL
ну вообще да - прогресс далеко ушел и совет по events тут вполне уместен. Когда я работала с MS SQL (давно) - делала почти то же самое "вручную" - сделала job+SP которая крутилась в цикле постоянно и проверяла дедлоки. Если находила - собирала всю возможную инфу - кто, когда, чем и что - и отправляла мне на мыло и селл.
Далее начинались разборки с программерами - кто чего не так написал. Они, конечно, в отказ. Пришлось написать быстренько процедуру, которая проверяла "закрытость" явно обьявленных транзакций - т.е. чтобы на каждый "begin" был свой "commit" или "rollback". Нашлось несколько таких процедур. Пофиксили, да и все.
А там. где причина была в lock order - пришлось самой искать решение и уже потом идти с готовым к программерам, т.к. сами они не всегда понимали о чем вообще речь.
Далее начинались разборки с программерами - кто чего не так написал. Они, конечно, в отказ. Пришлось написать быстренько процедуру, которая проверяла "закрытость" явно обьявленных транзакций - т.е. чтобы на каждый "begin" был свой "commit" или "rollback". Нашлось несколько таких процедур. Пофиксили, да и все.
А там. где причина была в lock order - пришлось самой искать решение и уже потом идти с готовым к программерам, т.к. сами они не всегда понимали о чем вообще речь.
-
- Уже с Приветом
- Posts: 946
- Joined: 24 Sep 2013 05:58
- Location: US\GA
Re: Как найти причину Deadlock в MS SQL
И как такое работает, когда 100-200 сессий меняющих данные в одной таблице, особенно в её горячем хвосте?Dmitry67 wrote: ↑19 Oct 2017 15:39При этом данные с B<>222 также оказываются прочитанными и заблокированными. Это не баг, это важно для consistency. Соотвественно, вы можете словить блокировку или дедлок по данным которые даже не меняли (B<>222). Индекс по A,B накладывает RANGE LOCK по A,B сразу и не касается данных которе вы не трогаете
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
В OLTP системах как правило эффективный доступ к документам по ID в лоб, так что такой проблемы нетmskmel wrote: ↑19 Oct 2017 20:52И как такое работает, когда 100-200 сессий меняющих данные в одной таблице, особенно в её горячем хвосте?Dmitry67 wrote: ↑19 Oct 2017 15:39При этом данные с B<>222 также оказываются прочитанными и заблокированными. Это не баг, это важно для consistency. Соотвественно, вы можете словить блокировку или дедлок по данным которые даже не меняли (B<>222). Индекс по A,B накладывает RANGE LOCK по A,B сразу и не касается данных которе вы не трогаете
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Вы про DB2 for LUW говорите, как я понимаю. В DB2 for zOS deadlocks выявляются автоматом (вопрос к Дмитрию и другим здесь специалистам по MS SQL - MS SQL способен выявлять deadlocks автоматически и решать проблему?) и один из участников убивается через 5 секунд (это время можно менять). Висячих deadlocks быть не может.
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Как найти причину Deadlock в MS SQL
блокируются. просто ради экономии памяти роль блоикровки индекса выполняет лок на данные. в 21 веке эта экономия отдает навозом. db2 читая страницы индекса вынужден проверять блокировки связанных строк данных, во времена db2 4.1 в 90х с 16мб памяти может это и было оправдано, но теперь этот подход - куча навоза
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Ты молодец, iDesperado, я тебя искренне уважаю. Ты читаешь предложенные ссылки, вникаешь... и находишь что сказать. Талант. Талантище!iDesperado wrote: ↑19 Oct 2017 22:28блокируются. просто ради экономии памяти роль блоикровки индекса выполняет лок на данные. в 21 веке эта экономия отдает навозом. db2 читая страницы индекса вынужден проверять блокировки связанных строк данных, во времена db2 4.1 в 90х с 16мб памяти может это и было оправдано, но теперь этот подход - куча навоза
Искомых грибов - опят не нашел, их нет еще, жаркая осень нынче в Торонто. Но маслят набрал. Были на одном, небольшом, пяточке в лесу, по которому я два часа носился по местам где в прошлом году собирал опята.
На входе в лес было (впервые за 17 лет в Канаде) предупреждение о клещах: blacklegged ticks. Но это меня не остановило. Жена вон жарит эти грибочки, сейчас еще накачу.
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Re: Как найти причину Deadlock в MS SQL
Дима, ты не прав. Над предложенным надо, как минимум, задуматься. Возможно, и весьма вероятно, что это имеет смысл и может сократить вероятность deadlocks.
Ведь я же целых четыре решения предложил и никто на опровергнул ни одного.
-
- Уже с Приветом
- Posts: 1494
- Joined: 08 Mar 2002 10:01
- Location: NJ
Re: Как найти причину Deadlock в MS SQL
А если 20 индексов на таблице, они все блокируются? Это же может тормозить сильно.iDesperado wrote: ↑19 Oct 2017 22:28 блокируются. просто ради экономии памяти роль блоикровки индекса выполняет лок на данные. в 21 веке эта экономия отдает навозом. db2 читая страницы индекса вынужден проверять блокировки связанных строк данных, во времена db2 4.1 в 90х с 16мб памяти может это и было оправдано, но теперь этот подход - куча навоза
Ну не совсем бесполезный, он мне помог сдать экзамен на джава программиста )
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
ПояснюzVlad wrote: ↑19 Oct 2017 23:28Дима, ты не прав. Над предложенным надо, как минимум, задуматься. Возможно, и весьма вероятно, что это имеет смысл и может сократить вероятность deadlocks.
Ведь я же целых четыре решения предложил и никто на опровергнул ни одного.
Вы приходите в реальный проект. Там проблемы с дедлоками. Вы начинаете разбираеться. Там 1000000 строк кода на .net который что-то делает в нескольких продуктах, причем некоторые легаси а некоторые даже третьих фирм.
Разумеется, правильным порядком в транзакцию там и не пахнет- кто в лес, а кто по дрова. Что посоветуете? Переписать ВСЕ? Это похоже на совет мышам стать ежиками, как в известном анекдоте
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 56113
- Joined: 06 May 2001 09:01
Re: Как найти причину Deadlock в MS SQL
я в такой ситуации дополнительный синхронизатор между базой и клиентами вставлял. Другими словами: заменил вызов sql в системе на свой, который сперва по полочкам все разложил, а потом уже выполнял реальный вызов.Dmitry67 wrote: ↑20 Oct 2017 06:09 Поясню
Вы приходите в реальный проект. Там проблемы с дедлоками. Вы начинаете разбираеться. Там 1000000 строк кода на .net который что-то делает в нескольких продуктах, причем некоторые легаси а некоторые даже третьих фирм.
Разумеется, правильным порядком в транзакцию там и не пахнет- кто в лес, а кто по дрова. Что посоветуете? Переписать ВСЕ? Это похоже на совет мышам стать ежиками, как в известном анекдоте
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
Плавали-Знаем! (C)
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Как найти причину Deadlock в MS SQL
при чтении с индекса ты можешь положить 1 range lock, вместо мульенов локов на таблицу. уже обалденный выигрыш. плюс у мскл я помню полно оптимизаций на эту тему. там можно считать значение с индекса в тот момент когда строка залочена эксклюзивно и меняются значения полей, не входящие в индекс.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
Кстати, хотел вернуться к этой вкусной теме
Мейнфреймовцы имеют какой то особый стиль писать сообщения
Они ни фига не похожи на нормальный английский язык
Допустим я хотел бы сделать user friendly сообщение о check engine в автомобиле
У обычного программиста это выглядело бы так:
У мейнфреймовца это выглядело бы так:Check Engine on Odometer reading=34555mi
Error code: 108 (Spark damaged or other problems)
Cylinder 3.
Code: Select all
-----
ERRCND=108
SENSR 0x22 SENSRNAME=ODOMTR VALUE=34555 VALUE.UNIT=MI
CYL 0x0=STATUS OK CYL 0x1=STATUS OK
CYL 0x2=ERR REASON 0x347373 REASNTYP=45
CYL 0x3=STATUS OK
DIAG MGR *****
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Re: Как найти причину Deadlock в MS SQL
Для тех, кто хочет писать также, нехитрые советы
1. ONLY UPPERCASE !!!
2. Больше сокращений, не ERROR TYPE а ERRTYP
3. Выкидывайте больше гласных, REASON можно сократить до RSN. Если не будете сокращать, то кончатся все 80 позиций на перфокарте!
4. Больше умничания, больше hex, непонятных слов и сокращений. Главное - самая важная информация должна потонуть в этом месиве!
5. Выводите только код проблемы, и НИ В КОЕМ СЛУЧАЕ ее описание. Ничего, найдут в документации по коду.
6. Напоследок - шлифанте результат ascii art - немножно ----, *** итд по вкусу.
Et voila!
1. ONLY UPPERCASE !!!
2. Больше сокращений, не ERROR TYPE а ERRTYP
3. Выкидывайте больше гласных, REASON можно сократить до RSN. Если не будете сокращать, то кончатся все 80 позиций на перфокарте!
4. Больше умничания, больше hex, непонятных слов и сокращений. Главное - самая важная информация должна потонуть в этом месиве!
5. Выводите только код проблемы, и НИ В КОЕМ СЛУЧАЕ ее описание. Ничего, найдут в документации по коду.
6. Напоследок - шлифанте результат ascii art - немножно ----, *** итд по вкусу.
Et voila!
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1494
- Joined: 08 Mar 2002 10:01
- Location: NJ
Re: Как найти причину Deadlock в MS SQL
LOL. А на XML было бы так:
Code: Select all
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE HTML PUBLIC "-//VAZ MOTORS//DTD HTML 4.0 Transitional//EN" "http://www.blahlbah.org/dadidadah/govno/govno/%81%AB%EF%A4%EC%20%F1%A1%20%E2%A2%AE%EE%20%AC%A0%E2%EC.dtd" >
<?xml-stylesheet type="text/xsl" href="http://www.blahlbah.org/dadidadah/govno/govno/%8F%A8%A7%A4%A5%E6%20%8F%A8%A7%A4%A5%E6.xsl"?>
<vaz:document xmlns:vaz = "http://www.blahlbah.org/dadidadah/govno/govno/%8F%A8%A7%A4%A5%E6%20%8F%A8%A7%A4%A5%E6.xhtml">
<!-- here_we_go_to_the_f_cking_business_at_last -->
<vaz:the_message>Check Engine</vaz:the_message>
<vaz:odometer>
<vaz:reading measure = "mi">34555</vaz:reading>
</vaz:odometer>
<vaz:error>
<vaz:code>108</vaz:code>
<vaz:error_message>Spark damaged or other problems</vaz:error_message>
<vaz:location type = "cylinder">3</vaz:location>
</vaz:error>
</vaz:document>
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Как найти причину Deadlock в MS SQL
да, но xml рендерится в сексуальные картинки, читать то xml никто не просит
-
- Уже с Приветом
- Posts: 7723
- Joined: 29 Mar 2000 10:01
- Location: Kirkland,WA
Re: Как найти причину Deadlock в MS SQL
Я автор большого куска этого xml. Сам придумывал, никто пальцем не указывал - так что плюхи мне если что. Xml был введен в 2002 году, тогда слово json не слышали. С предыдушим текстовым было много проблем - тяжело натравливать тулзы на него было.
Кстати, ничего дополнительно включать не надо для сбора таких событий - https://blog.sqlauthority.com/2017/01/0 ... ed-events/
А что касается как с ними бороться - это трудно. Highest cost support cases in average...
Кстати, ничего дополнительно включать не надо для сбора таких событий - https://blog.sqlauthority.com/2017/01/0 ... ed-events/
А что касается как с ними бороться - это трудно. Highest cost support cases in average...