|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Есть процедура, делающая простой апдейт, типа такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
Блокировка возникает, когда два приложения одновременно вызывают эту процедуру. Как обойти блокировку, выбор жертвы?т.е. чтобы апдейты в обеих процедурах выполнились ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 16:12 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, какие индексы есть на таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 16:30 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff Ролг Хупин, какие индексы есть на таблице? по id - кластерный, первичный ключ Если не одновременно вызвается срабатывает быстро и оба и больше вызовов, но если в один момент - имею блокировку. Что сделать - апп лок, пусть все по очереди ждут и последовательно выполняются? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 17:41 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, а вы под "блокировкой" понимаете именно deadlock или просто одна сессия ждет завершения апдейта другой? если deallock то граф приложите пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 17:53 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, судя по всему так косноязычно имеется виду взимоблокировка. ее не должно быть. первая транзакция лочит, другая ждет. нужен граф дедлока, из него будет ясно что происходит. как бонус можно попробовать IL serializable, может поможет выстроить последовательно транзакции. на дефолтном IL read committed mssql есть оптимизации, например на RC можно прочитать залоченное значение из индекса, но вроде перед нами не тот случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 17:56 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff Ролг Хупин, а вы под "блокировкой" понимаете именно deadlock или просто одна сессия ждет завершения апдейта другой? если deallock то граф приложите пожалуйста. да, сервер определяет как дедлок, определяет жертву и разрешает конфликт. Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 20:18 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, Код процедуры как бы реальный, тогда и индекс исходя из этого кода должен быть по id, m - ключевые поля. Поможет или нет - нужно пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 21:52 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, "как я должен изменить процедуру" Для этого необходимо получить граф взаимоблокировки. https://www.yandex.ru/search/?lr=39&offline_search=1&text=как получить граф взаимоблокировки sql server ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 23:11 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было. Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции. Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться) Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 08:06 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
alexeyvg Ролг Хупин Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было. Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции. Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться) Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру. Возможно, просто из-за конкуренции за страницу. Можно, например, запретить страничные блокировки на таблице. Или вообще оставить только строчные. От ситуации зависит. Пусть граф дедлока покажет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 11:28 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster Возможно, просто из-за конкуренции за страницу. Это из за роу-блокировок? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 12:42 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster Пусть граф дедлока покажет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 12:42 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster alexeyvg пропущено... Обновление одной записи по PK - куда уж менять? :-) Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции. Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться) Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру. Возможно, просто из-за конкуренции за страницу. Можно, например, запретить страничные блокировки на таблице. Или вообще оставить только строчные. От ситуации зависит. Пусть граф дедлока покажет. Файл с дедлоком прицепил ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:12 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:29 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, у вас там борьба за ключи индекса и к тому же некластерного IX_x2_p_id2. у него ключ как я понимаю колонка p_id2? и к тому же вы слукавили :-) запросы вида Код: sql 1.
отличаются от Код: sql 1.
собственно в плане сканирование IX_x2_p_id2? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:30 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
alexeyvg Ролг Хупин Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было. Дедлок тут может быть только из за наличия индексов , или из за других действий в длинной внешней транзакции. Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться) Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру. +<keylock id="lock693736b600" associatedObjectId="72060033870331904" mode="X" indexname="IX_x2_p_id2" objectname="db.dbo.x2" dbid="5" hobtid="72060033870331904"> -<keylock id="lock5ff9f96980" associatedObjectId="72060033870331904" mode="U" indexname="IX_x2_p_id2" objectname="db.dbo.x2" dbid="5" hobtid="72060033870331904"> Именно оно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:32 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff запросы вида Код: sql 1.
отличаются от Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:36 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster +<keylock id="lock693736b600" associatedObjectId="72060033870331904" mode="X" indexname="IX_x2_p_id2" objectname="db.dbo.x2" dbid="5" hobtid="72060033870331904"> -<keylock id="lock5ff9f96980" associatedObjectId="72060033870331904" mode="U" indexname="IX_x2_p_id2" objectname="db.dbo.x2" dbid="5" hobtid="72060033870331904"> Именно оно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:38 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
alexeyvg felix_ff запросы вида Код: sql 1.
отличаются от Код: sql 1.
хрустальные шары разогревали ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:39 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff alexeyvg пропущено... Мда, и что мы тут обсуждали??? :-) хрустальные шары разогревали упрощал, щадил читателей, убирал всякую фигню ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:47 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Можно для update попробовать сразу xlock выставлять, хотя это может сказаться на производительности - будут неоправданные ожидания там, где обновление не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:47 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster Код: sql 1.
? Т.е. решение в этом случае: сделать (loop join) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:49 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин uaggster Код: sql 1.
? Т.е. решение в этом случае: сделать (loop join) ? что там у вас с планом запроса для этой процедуры? у вас проблема в том что при операции апдейта блокируется несколько ключей индекса IX_x2_p_id2 U-блокировкой которая впоследствии будет сконвертирована в X получается что у вас предикат: p_id2= @new_p_id возвращает или несколько строк, или не используется index_seek а вместо этого идет скан индекса., или там range scan. кароче план еще желательно продемонстрируйте ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 15:01 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин uaggster Код: sql 1.
? Т.е. решение в этом случае: сделать (loop join) ? Не совсем понял авторUsing OPTION(LOOP JOIN) appears to allow the query optimizer to join the tables using the nested loops in which ever order it deems is best. Но у меня одна таблица, что оптимизатор будет джойнить? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 15:02 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин, UPDATE x2 WITH (PAGLOCK, XLOCK) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 15:10 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff Ролг Хупин пропущено... Т.е. решение в этом случае: сделать (loop join) ? что там у вас с планом запроса для этой процедуры? у вас проблема в том что при операции апдейта блокируется несколько ключей индекса IX_x2_p_id2 U-блокировкой которая впоследствии будет сконвертирована в X получается что у вас предикат: p_id2= @new_p_id возвращает или несколько строк, или не используется index_seek а вместо этого идет скан индекса., или там range scan. кароче план еще желательно продемонстрируйте кстати, да, по этому критерию может возвращаться не одна запись, а подмножество, у которых p_id2= @new_p_id, это нормальный случай, типа двухуровневая иерархия с парентом p_id2. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 15:12 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
До сих пор ищу выход: как решить проблему блокировки? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 11:58 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин До сих пор ищу выход: как решить проблему блокировки? До сих пор пишу: покажите актуальный план для запуска процедуры ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 12:12 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff Ролг Хупин До сих пор ищу выход: как решить проблему блокировки? До сих пор пишу: покажите актуальный план для запуска процедуры Эх, плана нет, это живая база, есть граф, я привел на пред.странице. Апдейт блокирует апдейт ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 12:30 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин Эх, плана нет, это живая база При желании и возможности можно добыть и актуальные - профайлером, XE или sys.dm_exec_query_plan_stats ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 13:13 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин felix_ff пропущено... До сих пор пишу: покажите актуальный план для запуска процедуры Эх, плана нет, это живая база, есть граф, я привел на пред.странице. Апдейт блокирует апдейт Блаженны верующие... в чудеса. ЗЫ. Ежели фся проблема в этой процедуре - давно бы sp_getapplock задействовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 16:59 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин felix_ff пропущено... До сих пор пишу: покажите актуальный план для запуска процедуры Эх, плана нет, это живая база, есть граф, я привел на пред.странице. Апдейт блокирует апдейт Код: sql 1.
http://whoisactive.com/ ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 08:20 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
Ролг Хупин Есть процедура, делающая простой апдейт, типа такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
Блокировка возникает, когда два приложения одновременно вызывают эту процедуру. Как обойти блокировку, выбор жертвы?т.е. чтобы апдейты в обеих процедурах выполнились Вопрос первый -- это единственная команда в транзации? Вопрос второй -- какой уровень изоляции? Вопрос третий -- Вот это зачем: option (loop join)? Предложения -- можете перейти на read committed snapshot? Вот здесь разбирается как решить это через UPLOCK https://www.mssqltips.com/sqlservertip/6290/sql-server-update-lock-and-updlock-table-hints/ ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 12:16 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster Ролг Хупин пропущено... Эх, плана нет, это живая база, есть граф, я привел на пред.странице. Апдейт блокирует апдейт Код: sql 1.
http://whoisactive.com/ Эта опция показывает план без актуальных данных. http://whoisactive.com/docs/11_planning/"A few people have asked whether the plans returned by Who is Active are the “actual” or “estimated” plans. The answer depends on how you define these terms. "Actual plan" usually refers to the query plan that has the actual row counts, number of executions for each iterator, and various other information that can only be collected once a query has completed. Who is Active cannot return that version of the plan. But the plan it returns is indeed the "actual" plan that's running at the time; in other words, the plan will not be recompiled into some other plan by the time Who is Active can get it." sp_blitzwho позволяет получить live план (sql2016sp1+) https://www.brentozar.com/archive/2017/10/get-live-query-plans-sp_blitzwho/ ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 12:33 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
a_voronin Вопрос первый -- это единственная команда в транзации? Вопрос второй -- какой уровень изоляции? Вопрос третий -- Вот это зачем: option (loop join)? Предложения -- можете перейти на read committed snapshot? предложение весьма ценно: у него 2 писателя бьются за один и тот же keylock. но да, RCSI блокировки писателей разрулит и мир спасет, примерно как и переезд в облако ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 12:45 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
a_voronin Предложения -- можете перейти на read committed snapshot? a_voronin Вот здесь разбирается как решить это через UPLOCK https://www.mssqltips.com/sqlservertip/6290/sql-server-update-lock-and-updlock-table-hints/ ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 12:51 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
komrad Эта опция показывает план без актуальных данных. Нет, с версии сервера 2016+ и версии хп 1.33 - вполне уже с данными. Но sp_blitzwho - тоже гляну, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 16:59 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
uaggster komrad Эта опция показывает план без актуальных данных. Нет, с версии сервера 2016+ и версии хп 1.33 - вполне уже с данными. Но sp_blitzwho - тоже гляну, спасибо. или Адам не обновлял документацию или она не возвращает актуальный план впринципе A few people have asked whether the plans returned by Who is Active are the “actual” or “estimated” plans. The answer depends on how you define these terms. "Actual plan" usually refers to the query plan that has the actual row counts, number of executions for each iterator, and various other information that can only be collected once a query has completed. Who is Active cannot return that version of the plan. But the plan it returns is indeed the "actual" plan that's running at the time; in other words, the plan will not be recompiled into some other plan by the time Who is Active can get it. актуальный план можно вернуть только или использовав xEvent/SQLTrace/или когда включено облегченное профилирование через sys.dm_exec_query_statistics_xml/sys.dm_exec_query_plan_stats я не смотрел сорцы процедурки может там референсы есть, но пока из документации выдержка намекает что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 17:29 |
|
Как избежать блокировки?
|
|||
---|---|---|---|
#18+
felix_ff , видимо, не обновлял: Вот скриншот плана, который у меня получается по exec sp_whoisactive @get_plans=1 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 17:44 |
|
|
start [/forum/search_topic.php?author=Svawick&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 685ms |
total: | 871ms |
0 / 0 |