powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Дедлоки с Intent Locks объектов
25 сообщений из 41, страница 1 из 2
Дедлоки с Intent Locks объектов
    #39749396
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Помогаю разработчикам с определением причин появления дедлоков. Изначально было похоже на классику: проблема с одной из таблиц, две страницы в ней, два запроса.
Первый запрос с Insert и Select блочит первую страницу и хочет вторую, а второй запрос заблочил вторую страницу и хочет первую. Стандартный дедлок, вопросов не было.

Эту часть переработали, но проблема осталась. Сейчас при дедлоке на этой же таблице блочат друг друга два селекта.

Данные собраны через Extended Events. Прикладываю схему.
По схеме блокировку первой страницы делает почему-то не S, а IX и SIX, что для выловленных запросов избыточно. Насколько я понимаю, для решения проблемы нужно понять, почему ставит блокировку не S, и по возможности изменить этот момент. Но пока причин не вижу.

Проблемная таблица "n_order_marketing_complex_service" - одна из трех таблиц участвующих в join.

Запрос жертва:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
(@P1 nvarchar(4000))
            SELECT
                1 flow_doctype,
                ote.order_num flow_id,
                ote.order_num order_num,
                IIF(omcs.service_id IS NULL, od.serv_id, omcs.service_id) AS serv_id,
                1 count,
                IIF(omcs.service_id IS NULL, od.price, omcs.price) AS price,
                1 flow_type,
                ote.DateReg flow_date,
                IIF(omcs.service_id IS NULL, od.total, omcs.total) AS total,
                od.bonuses,
                od.cito_factor,
                ote.OrderKontragentID sender_id,
                ote.OrderDiscount discount,
                IIF(omcs.service_id IS NULL, od.outlet_price, dbo.GetPrice(ote.reg_point, omcs.service_id, ote.DateIns)) outlet_price,
                IIF(omcs.service_id IS NULL, od.order_service_id, CONCAT(od.order_num, '/', omcs.service_id)) AS order_service_id,
                omcs.complex_id
            FROM n_OrderDetail od
                LEFT JOIN OrdersToExport ote ON ote.order_num = od.order_num
                LEFT JOIN n_order_marketing_complex_service omcs ON omcs.order_num = od.order_num AND omcs.complex_id = od.serv_id
            WHERE ote.order_num = @P1



Оставшийся запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
(@P1 nvarchar(8))
            SELECT
                1 flow_doctype,
                ote.order_num flow_id,
                ote.order_num order_num,
                IIF(omcs.service_id IS NULL, od.serv_id, omcs.service_id) AS serv_id,
                1 count,
                IIF(omcs.service_id IS NULL, od.price, omcs.price) AS price,
                1 flow_type,
                ote.DateReg flow_date,
                IIF(omcs.service_id IS NULL, od.total, omcs.total) AS total,
                od.bonuses,
                od.cito_factor,
                ote.OrderKontragentID sender_id,
                ote.OrderDiscount discount,
                IIF(omcs.service_id IS NULL, od.outlet_price, dbo.GetPrice(ote.reg_point, omcs.service_id, ote.DateIns)) outlet_price,
                IIF(omcs.service_id IS NULL, od.order_service_id, CONCAT(od.order_num, '/', omcs.service_id)) AS order_service_id,
                omcs.complex_id
            FROM n_OrderDetail od
                LEFT JOIN OrdersToExport ote ON ote.order_num = od.order_num
                LEFT JOIN n_order_marketing_complex_service omcs ON omcs.order_num = od.order_num AND omcs.complex_id = od.serv_id
            WHERE ote.order_num = @P1
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749401
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

т.е. SELECT без видимых причин решил что ему нужен SIX? Граф дедлока в xml покажите
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749416
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Причина наверняка где-то есть.

План XML: (скрыл имя хоста, пользователя и базу)

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
<deadlock>
 <victim-list>
  <victimProcess id="process42eef144e8" />
 </victim-list>
 <process-list>
  <process id="process42eef144e8" taskpriority="0" logused="12536" waitresource="PAGE: 9:1:116120662 " waittime="1049" ownerId="30254457035" transactionname="user_transaction" lasttranstarted="2018-12-18T10:48:41.147" XDES="0x4e382696c8" lockMode="S" schedulerid="1" kpid="11736" status="suspended" spid="3547" sbid="1" ecid="0" priority="0" trancount="1" lastbatchstarted="2018-12-18T10:48:41.283" lastbatchcompleted="2018-12-18T10:48:41.283" lastattention="1900-01-01T00:00:00.283" hostname=" скрыто " hostpid="0" loginname=" скрыто " isolationlevel="read committed (2)" xactid="30254457035" currentdb="9" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="2" stmtstart="66" stmtend="2428" sqlhandle="0x02000000b2230d0756002740d3d3ca09f315bfc98114fd7c0000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000))
            SELECT
                1 flow_doctype,
                ote.order_num flow_id,
                ote.order_num order_num,
                IIF(omcs.service_id IS NULL, od.serv_id, omcs.service_id) AS serv_id,
                1 count,
                IIF(omcs.service_id IS NULL, od.price, omcs.price) AS price,
                1 flow_type,
                ote.DateReg flow_date,
                IIF(omcs.service_id IS NULL, od.total, omcs.total) AS total,
                od.bonuses,
                od.cito_factor,
                ote.OrderKontragentID sender_id,
                ote.OrderDiscount discount,
                IIF(omcs.service_id IS NULL, od.outlet_price, dbo.GetPrice(ote.reg_point, omcs.service_id, ote.DateIns)) outlet_price,
                IIF(omcs.service_id IS NULL, od.order_service_id, CONCAT(od.order_num, '/', omcs.service_id)) AS order_service_id,
                omcs.complex_id
            FROM n_OrderDetail od
                LEFT JOIN OrdersToExport ote ON ote.o   </inputbuf>
  </process>
  <process id="process65e4063c28" taskpriority="0" logused="28444" waitresource="PAGE: 9:1:116241658 " waittime="1250" ownerId="30254454272" transactionname="user_transaction" lasttranstarted="2018-12-18T10:48:40.977" XDES="0x58bcadb948" lockMode="S" schedulerid="10" kpid="10540" status="suspended" spid="3316" sbid="1" ecid="0" priority="0" trancount="1" lastbatchstarted="2018-12-18T10:48:41.077" lastbatchcompleted="2018-12-18T10:48:41.077" lastattention="1900-01-01T00:00:00.077" clientapp="Apache HTTP Server" hostname=" скрыто " hostpid="11796" loginname=" скрыто " isolationlevel="read committed (2)" xactid="30254454272" currentdb="9" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="2" stmtstart="62" stmtend="2464" sqlhandle="0x02000000115f650aea85b094ea93aa7fdedb9f1fbc4383670000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(8))
            SELECT
                1 flow_doctype,
                ote.order_num flow_id,
                ote.order_num order_num,
                IIF(omcs.service_id IS NULL, od.serv_id, omcs.service_id) AS serv_id,
                1 count,
                IIF(omcs.service_id IS NULL, od.price, omcs.price) AS price,
                1 flow_type,
                ote.DateReg flow_date,
                IIF(omcs.service_id IS NULL, od.total, omcs.total) AS total,
                od.bonuses,
                od.cito_factor,
                ote.OrderKontragentID sender_id,
                ote.OrderDiscount discount,
                IIF(omcs.service_id IS NULL, od.outlet_price, dbo.GetPrice(ote.reg_point, omcs.service_id, ote.DateIns)) outlet_price,
                IIF(omcs.service_id IS NULL, od.order_service_id, CONCAT(od.order_num, '/', omcs.service_id)) AS order_service_id,
                omcs.complex_id
            FROM n_OrderDetail od
                LEFT JOIN OrdersToExp   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <pagelock fileid="1" pageid="116120662" dbid="9" subresource="FULL" objectname="скрыто.dbo.n_order_marketing_complex_service" id="lockca1cd1e500" mode="SIX" associatedObjectId="72057596708061184">
   <owner-list>
    <owner id="process65e4063c28" mode="SIX" />
   </owner-list>
   <waiter-list>
    <waiter id="process42eef144e8" mode="S" requestType="wait" />
   </waiter-list>
  </pagelock>
  <pagelock fileid="1" pageid="116241658" dbid="9" subresource="FULL" objectname=" скрыто.dbo.n_order_marketing_complex_service" id="lock50c07c2c00" mode="IX" associatedObjectId="72057596708061184">
   <owner-list>
    <owner id="process42eef144e8" mode="IX" />
   </owner-list>
   <waiter-list>
    <waiter id="process65e4063c28" mode="S" requestType="wait" />
   </waiter-list>
  </pagelock>
 </resource-list>
</deadlock>
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749432
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Смотрите транзакции целиком. inputbuf показывает совсем не всё
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749441
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваши селекты выполняются в транзакциях, в которых ранее были модификации "скрыто.dbo.n_order_marketing_complex_service". Об этом свидетельствует наличие IX.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749446
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

А можете подсказать где? Я выкладывал из xml_deadlock_report из extended events.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749449
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

То есть - я вижу часть транзакции с селектом и где вроде нет причин, а блокирует часть, что через Extended Events не поймал?
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749472
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanionТо есть - я вижу часть транзакции с селектом и где вроде нет причин, а блокирует часть, что через Extended Events не поймал?Вы видите граф дедлока с конфликтующими инструкциями. Но это не означает, что ресурсы, за которые идет драка, заблокированы только этими инструкциями .
У вас именно этот случай.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749519
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Спасибо за ответ.

А я как-то могу получить полную видимость ситуации с этими блокировками?
Или это только через разработчиков можно, чтобы смотрели что полностью выполняется при этом запросе?
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749522
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danioninvm,

Спасибо за ответ.

А я как-то могу получить полную видимость ситуации с этими блокировками?
Или это только через разработчиков можно, чтобы смотрели что полностью выполняется при этом запросе?
Быстрее у разработчиков, судя по тому что у вас там одно и то же
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749532
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Хорошо, попробую через разработчиков. Стабильность по времени начала и конца массовых дедлоков присутствует.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749635
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Сорее всего, ваш селект сканирует таблицу n_order_marketing_complex_service.
Возможно создание правильного индекса уберет таковое и запросы из разных сессий перестанут пересекаться по данным. Заодно может снизится гранулярность блокировок.
Соответственно, данный дедлок исчезнет.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749656
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

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

В селекте из этой таблицы участвуют в join поля omcs.order_num и omcs.complex_id.

По таблице есть индексы и например этот не кластерный индекс включает данные поля:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE UNIQUE NONCLUSTERED INDEX [iu_n_order_marketing_complex_service$order_num$complex_id$service_id] ON [dbo].[n_order_marketing_complex_service]
(
	[order_num] ASC,
	[complex_id] ASC,
	[service_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749684
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanionНе понял как добавление индекса поможет с блокировкамИндекс может убрать сканирование таблицы из плана выполнения. Соответственно, конкурирующие запросы перестанут пересекаться по читаемым данным.
Показанный индекс возможно малоприменим для данного запроса, т.к. за значениями столбцов omcs.price и omcs.total все равно придется лезть в таблицу.
План запроса смотрите - там все видно.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749714
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Вот план запроса, поиск по индексу составил 91%. Как-то много.
! знак ругается на большее количество преобразований типов данных в рамках плана запросов.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749719
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danioninvm,

Вот план запроса, поиск по индексу составил 91%. Как-то много.

это трактуется так: 91% всего времени выполнения происходил index seek (самое быстрое что может быть)

% - это величина относительная, а не абсолютная
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749723
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужен актуальный план выполнения
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749730
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,

Просто там несколько сканирований индексов и 91% у одного удивило.

А чем этот план не актуальный? Данные из кеша. При дедлоке Extended Events похоже не собирает данные, попробую профайлером завтра, там вроде было.

Пытаюсь выяснить подробности у разрабов, пока выходит одна транзакция с кучей Select, update, delete, insert, один из кусков которой и есть с селектами. Тогда почему не падает всё остальное...
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749743
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

"Правильный" для данного запроса индекс есть (правда не тот, который вы показали) и он задействован. Значит версия о полном сканировании таблицы отпадает.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749946
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Индекс этот применялся:

CREATE NONCLUSTERED INDEX [in_n_order_marketing_complex_service$complex_id$order_num$service_id$price$total] ON [dbo].[n_order_marketing_complex_service]
(
[complex_id] ASC
)
INCLUDE ( [order_num],
[service_id],
[price],
[total]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


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

С таблицей по которой дедлоки происходит update, потом этом запрос с селектами, после в ней ничего не меняется.
Кроме варианта с грязным чтением (который может дать не соответствующие действительности данные) что-то можно сделать? Например как-то изменять уровень блокировки на S после update...
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749952
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanionС таблицей по которой дедлоки происходит update, потом этом запрос с селектами, после в ней ничего не меняется.Покажите этот update.
Danionчто-то можно сделать?Радикально - включить RCSI.
Паллиативно, пока не выяснена причина дедлока - добавить хинт rowlock к таблице в селекте.
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749956
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Вот:

Код: sql
1.
2.
3.
4.
5.
6.
7.
 UPDATE [dbo].[n_order_marketing_complex_service] SET [total]=:yp0, [bonuses]=:yp1 WHERE [dbo].[n_order_marketing_complex_service].[aid]=3028507
-----------------
 UPDATE [dbo].[n_order_marketing_complex_service] SET [total]=:yp0, [bonuses]=:yp1 WHERE [dbo].[n_order_marketing_complex_service].[aid]=3028504
-----------------
 UPDATE [dbo].[n_order_marketing_complex_service] SET [total]=:yp0, [bonuses]=:yp1 WHERE [dbo].[n_order_marketing_complex_service].[aid]=3028505
-----------------
 UPDATE [dbo].[n_order_marketing_complex_service] SET [total]=:yp0, [bonuses]=:yp1 WHERE [dbo].[n_order_marketing_complex_service].[aid]=3028506
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749966
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aid - это ПК?
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749969
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При включении RCSI нашел упоминание о проблемах с миррорингом в начале. Вроде не критично с данной проблемой блокировок, но база в AlwaysOn. Как-то может влиять? Вроде не должно.

invm,

Нет, похоже на номер заказа. По нему настроен первичный ключ таблицы.

ALTER TABLE [dbo].[n_order_marketing_complex_service] ADD PRIMARY KEY CLUSTERED
(
[aid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Дедлоки с Intent Locks объектов
    #39749974
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересные тут беседы у вас
invmaid - это ПК?
Danion Нет
...
Код: sql
1.
ALTER TABLE [dbo].[n_order_marketing_complex_service] ADD PRIMARY KEY CLUSTERED ([aid] ASC)
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Дедлоки с Intent Locks объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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