powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как избежать блокировки?
40 сообщений из 40, показаны все 2 страниц
Как избежать блокировки?
    #40060762
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть процедура, делающая простой апдейт, типа такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE [dbo].[test] 
@id int
AS
BEGIN
update t set m=m+1 where id=@id
END
GO



Блокировка возникает, когда два приложения одновременно вызывают эту процедуру.

Как обойти блокировку, выбор жертвы?т.е. чтобы апдейты в обеих процедурах выполнились
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060768
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

какие индексы есть на таблице?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060791
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Ролг Хупин,

какие индексы есть на таблице?


по id - кластерный, первичный ключ

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

Что сделать - апп лок, пусть все по очереди ждут и последовательно выполняются?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060795
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

а вы под "блокировкой" понимаете именно deadlock или просто одна сессия ждет завершения апдейта другой?

если deallock то граф приложите пожалуйста.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060797
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

судя по всему так косноязычно имеется виду взимоблокировка. ее не должно быть. первая транзакция лочит, другая ждет. нужен граф дедлока, из него будет ясно что происходит.
как бонус можно попробовать IL serializable, может поможет выстроить последовательно транзакции. на дефолтном IL read committed mssql есть оптимизации, например на RC можно прочитать залоченное значение из индекса, но вроде перед нами не тот случай.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060822
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Ролг Хупин,

а вы под "блокировкой" понимаете именно deadlock или просто одна сессия ждет завершения апдейта другой?

если deallock то граф приложите пожалуйста.


да, сервер определяет как дедлок, определяет жертву и разрешает конфликт.

Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060832
Mr. X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

Код процедуры как бы реальный, тогда и индекс исходя из этого кода должен быть по id, m - ключевые поля. Поможет или нет - нужно пробовать.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060853
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

"как я должен изменить процедуру"
Для этого необходимо получить граф взаимоблокировки.
https://www.yandex.ru/search/?lr=39&offline_search=1&text=как получить граф взаимоблокировки sql server
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060890
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было.
Обновление одной записи по PK - куда уж менять? :-)

Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции.
Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться)
Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060950
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Ролг Хупин
Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было.
Обновление одной записи по PK - куда уж менять? :-)

Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции.
Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться)
Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру.

Возможно, просто из-за конкуренции за страницу.
Можно, например, запретить страничные блокировки на таблице.
Или вообще оставить только строчные.
От ситуации зависит.
Пусть граф дедлока покажет.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060981
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Возможно, просто из-за конкуренции за страницу.
Хм ,а что, возможен дедлок при доступе к одной странице?
Это из за роу-блокировок?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40060982
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Пусть граф дедлока покажет.
Это да, вообще, о дедлоках глупо вообще начинать говорить без графа, зачем терять время...
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061011
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
alexeyvg
пропущено...
Обновление одной записи по PK - куда уж менять? :-)

Дедлок тут может быть только из за наличия индексов, или из за других действий в длинной внешней транзакции.
Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться)
Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру.

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


Файл с дедлоком прицепил
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061023
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID() option (loop join);


?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061026
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

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

у него ключ как я понимаю колонка p_id2?

и к тому же вы слукавили :-)

запросы вида
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID();



отличаются от
Код: sql
1.
update t set m=m+1 where id=@id 




собственно в плане сканирование IX_x2_p_id2?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061027
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
Ролг Хупин
Но хотелось бы понять, как я должен изменить процедуру, чтобы такой фигни не было.
Обновление одной записи по PK - куда уж менять? :-)

Дедлок тут может быть только из за наличия индексов , или из за других действий в длинной внешней транзакции.
Если внешней транзакции нет, то можно попробовать убрать индексы (но они же нужны, убрать может не получиться)
Если убрать индексы нельзя, то единственный способ решения проблемы - ловить ошибку дедлока и перезапускать эту процедуру.


+<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">
Именно оно.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061028
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
запросы вида
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID();


отличаются от
Код: sql
1.
update t set m=m+1 where id=@id 

Мда, и что мы тут обсуждали??? :-)
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061031
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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">
Именно оно.
Пусть тогда перезапускает апдэйт.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061032
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
felix_ff
запросы вида
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID();


отличаются от
Код: sql
1.
update t set m=m+1 where id=@id 

Мда, и что мы тут обсуждали??? :-)



хрустальные шары разогревали
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061035
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
alexeyvg
пропущено...
Мда, и что мы тут обсуждали??? :-)



хрустальные шары разогревали


упрощал, щадил читателей, убирал всякую фигню
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061038
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно для update попробовать сразу xlock выставлять, хотя это может сказаться на производительности - будут неоправданные ожидания там, где обновление не требуется.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061040
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID() option (loop join);


?


Т.е. решение в этом случае: сделать (loop join) ?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061046
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
uaggster
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID() option (loop join);


?


Т.е. решение в этом случае: сделать (loop join) ?


что там у вас с планом запроса для этой процедуры?

у вас проблема в том что при операции апдейта блокируется несколько ключей индекса IX_x2_p_id2 U-блокировкой которая впоследствии будет сконвертирована в X

получается что у вас предикат: p_id2= @new_p_id возвращает или несколько строк, или не используется index_seek а вместо этого идет скан индекса., или там range scan.

кароче план еще желательно продемонстрируйте
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061047
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
uaggster
Код: sql
1.
UPDATE x2 SET [order] =[order] +1 WHERE [order]>=@order AND id<>@child_id AND p_id2= @new_p_id AND @child_id<>dbo.NullID() option (loop join);


?


Т.е. решение в этом случае: сделать (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.

Но у меня одна таблица, что оптимизатор будет джойнить?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061052
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

UPDATE x2 WITH (PAGLOCK, XLOCK)
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061053
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061648
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До сих пор ищу выход: как решить проблему блокировки?
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061660
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
До сих пор ищу выход: как решить проблему блокировки?


До сих пор пишу: покажите актуальный план для запуска процедуры
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061675
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Ролг Хупин
До сих пор ищу выход: как решить проблему блокировки?


До сих пор пишу: покажите актуальный план для запуска процедуры


Эх, плана нет, это живая база, есть граф, я привел на пред.странице.

Апдейт блокирует апдейт
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061696
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Эх, плана нет, это живая база
План(ы), хотя бы оценочные, можно взять из sys.dm_exec_procedure_stats
При желании и возможности можно добыть и актуальные - профайлером, XE или sys.dm_exec_query_plan_stats
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061779
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
felix_ff
пропущено...


До сих пор пишу: покажите актуальный план для запуска процедуры


Эх, плана нет, это живая база, есть граф, я привел на пред.странице.

Апдейт блокирует апдейт

Блаженны верующие... в чудеса.

ЗЫ. Ежели фся проблема в этой процедуре - давно бы sp_getapplock задействовал.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061904
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин
felix_ff
пропущено...


До сих пор пишу: покажите актуальный план для запуска процедуры


Эх, плана нет, это живая база, есть граф, я привел на пред.странице.

Апдейт блокирует апдейт

Код: sql
1.
exec sp_whoisactive @get_plans=1


http://whoisactive.com/
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061982
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Есть процедура, делающая простой апдейт, типа такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE [dbo].[test] 
@id int
AS
BEGIN
update t set m=m+1 where id=@id
END
GO



Блокировка возникает, когда два приложения одновременно вызывают эту процедуру.

Как обойти блокировку, выбор жертвы?т.е. чтобы апдейты в обеих процедурах выполнились


Вопрос первый -- это единственная команда в транзации?
Вопрос второй -- какой уровень изоляции?
Вопрос третий -- Вот это зачем: option (loop join)?

Предложения -- можете перейти на read committed snapshot?

Вот здесь разбирается как решить это через UPLOCK
https://www.mssqltips.com/sqlservertip/6290/sql-server-update-lock-and-updlock-table-hints/
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061991
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Ролг Хупин
пропущено...


Эх, плана нет, это живая база, есть граф, я привел на пред.странице.

Апдейт блокирует апдейт

Код: sql
1.
exec sp_whoisactive @get_plans=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/
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40061996
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin

Вопрос первый -- это единственная команда в транзации?
Вопрос второй -- какой уровень изоляции?
Вопрос третий -- Вот это зачем: option (loop join)?

Предложения -- можете перейти на read committed snapshot?

предложение весьма ценно: у него 2 писателя бьются за один и тот же keylock.
но да, RCSI блокировки писателей разрулит и мир спасет, примерно как и переезд в облако
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40062003
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Предложения -- можете перейти на read committed snapshot?
Объяснить сможете как это поможет разрешить конфликт U-U или U-X?
a_voronin
Вот здесь разбирается как решить это через UPLOCK
https://www.mssqltips.com/sqlservertip/6290/sql-server-update-lock-and-updlock-table-hints/
Тот, кто будет лечить подобный дедлок показанным способом - достоин увольнения за профнепригодность.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40062157
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad

Эта опция показывает план без актуальных данных.

Нет, с версии сервера 2016+ и версии хп 1.33 - вполне уже с данными.
Но sp_blitzwho - тоже гляну, спасибо.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40062166
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

я не смотрел сорцы процедурки может там референсы есть, но пока из документации выдержка намекает что нет.
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40062169
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff , видимо, не обновлял:
Вот скриншот плана, который у меня получается по exec sp_whoisactive @get_plans=1
...
Рейтинг: 0 / 0
Как избежать блокировки?
    #40062170
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

ок, по раукаунтам верю ))
я просто пользуюсь самописом, не слежу за этой процей почти.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как избежать блокировки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]