powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При deadlock не прошло автоматическое снятие сессии
25 сообщений из 25, страница 1 из 1
При deadlock не прошло автоматическое снятие сессии
    #40019266
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

На сервере произошёл сбой, при ручной проверке запрос sp_WhoIsActive показало, что проблема в двух сессиях заблокировавших друг друга. Вроде простой дедлок, но они так висели 10+ минут, пока я не убил одну из сессий. При этом запрос по sys.sysprocesses показывал, что одна из сессий участников дедлока не заблокирована, а ждёт один из потоков параллелизма (CXPACKET).

Было похоже, на то что сервер по какой-то причине не смог опознать дедлок. Но настроен сбор сведений о дедлоках в Extended Events и там были события с этими двумя сессиями. При этом куча одинаковых событий на протяжении 10+ минут с пометкой одной из сессий как victim, но реально сессия убита не была. Во вложении пример схемы события, как victim был выбран запрос параллелизмом.

С чем может быть связано то, что SQL Server не смог убить участника дедлока и блокировки продолжались до вмешательства человека?
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019273
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сессия одна. У вас дедлоки внутри одного запроса с параллелизмом. Поэтому убивать нечего.
Лечение "в лоб" - выставить для запроса maxdop 1
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019275
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Там дедлок между двумя запросами. На один скриншот всё не влезло с нормальным масштабом и оставил все по 329 сессии.
Добавляю правый кусок схемы, там ресурс и вторая сессия.

Фиг, что-то не добавляет ещё скриншот. Правее от первого скрина ещё есть key lock по РК, ниже Page lock и правее вторая сессия участник дедлока.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019276
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Можно ещё попробовать проанализировать, на чём возникает кривое распределение по потокам и попробовать привести данные к более параллелизуемому виду.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019278
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попытка добавить общий скрин, но плохое качество деталей.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019297
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion

Фиг, что-то не добавляет ещё скриншот. Правее от первого скрина ещё есть key lock по РК, ниже Page lock и правее вторая сессия участник дедлока.

так не лепите граф картинкой, приведите текстом, можно в спойлере
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019337
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yasha123,
На схему вроде удобно смотреть для наглядности и её удалось выложить. В тексте много имён серверов, баз данных, таблиц и прочей информации, которую я бы предпочёл не указывать. Что никто не сталкивался с подобным?
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019355
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Сталкивались , конечно. И даже одно из решений первым же ответом дали.

Дедлоки на exchange event при ожиданиях cxpacket явно показывают, что проблема с распределением данных в потоках. Либо убивайте параллелизм, либо ищите как выровнять распределение (от банального on t1.id = t2.id + 0 , до ручных статистик и предварительных сортировок)
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019362
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Хм, по ссылке вроде блокировка с участием одной сессии - внутри потоков одного запроса. У меня же две разные сессии.
Там же: Just because you see “exchangeEvent” resources in your deadlock graph doesn’t necessarily mean that you are facing an intra-query parallelism deadlock. Sometimes the engine includes extraneous resources in the deadlock graph.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019368
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Отловите "в моменте" и убедитесь, что это не сессии координатора и слейва.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019386
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

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

Тут скорее интересует почему вообще такое может происходить.

<victim-list>
<victimProcess id="processbb3c067848" />
</victim-list>
<process id="processbb3c067848" taskpriority="0" logused="10000" waittime="396" schedulerid="10" kpid="18308" status="suspended" spid="329" sbid="1" ecid="4" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="Priklad" hostpid="0" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">

Часть информации по жертве, ecid 4 что совпадает со схемой. Дальше в xml идут process id остальных 4 потоков и сессия 428, но в victim-list они не входят. А SQL Server вообще может пытаться убить не всю сессию 329, а конкретный поток? Мне казалось, что нет, но пока в данной ситуации похоже именно на такую попытку.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019765
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion
env,
А SQL Server вообще может пытаться убить не всю сессию 329, а конкретный поток? Мне казалось, что нет, но пока в данной ситуации похоже именно на такую попытку.


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

взаимоблокировки связанные с параллелизмом в принципе известны (можете погуглить что то типа intra-query deadlock).
Поскольку механизм разрешения взаимоблокировок не реагирует именно на ситуации в параллельными взаимоблокировками решаются такие проблемы обычно анализом "а нужен ли вообще в том запросе параллелизм" и снижением степени для его возникновения.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019917
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff,

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

В данной ситуации основная проблема не в том, что вообще произошёл дедлок (это печально, но бывает), а в том, что SQL Server не смог сам убрать одну из сессий участников. Когда руками была убрана вторая сессия, то 329 с параллелизмом спокойно завершилась.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019920
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

вы граф дедлока полностью покажете наконец или будете кормить нас крупицами инфы из него?
прикрепите полный граф в xml формате.

если у вас была взаимоблокировка intra-query parallel thread то сиквел сам такие взаимоблокировки не разрешает.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019932
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff,

Ок, заменил имя БД, таблиц и сервера на аналог, остальное не трогал.

Код: 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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
<deadlock>
 <victim-list>
  <victimProcess id="processbb3c067848" />
 </victim-list>
 <process-list>
  <process id="processbb3c067848" taskpriority="0" logused="10000" waittime="396" schedulerid="10" kpid="18308" status="suspended" spid="329" sbid="1" ecid="4" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="priklad-12" hostpid="0" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="3" stmtstart="164" stmtend="1862" sqlhandle="0x02000000428fd42cd8f4fad83ab358d1900f3ce6206f5a550000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))SET DATEFORMAT dmy;

			SELECT 
				o.*,
				u.name as nurse,
				p.first_name, 
				p.middle_name, 
				p.last_name, 
				p.birthday,
				CAST(d.Discount AS nvarchar(50))+'% - '+d.DiscountName as discount, k.Name as partner,
				CASE WHEN (o.visit_date &lt;= convert(date, GETDATE()) AND o.status &lt; 2) OR (o.visit_date &lt; convert(date, GETDATE()) AND o.status = 2)
					THEN 1
					ELSE 0
				END AS timeoff,
				k.name as kontragentName
			FROM table1 o
			LEFT JOIN table2 p ON p.id = o.patient_id
			LEFT JOIN table3 u ON u.id=o.nurse_id
			LEFT JOIN table4 doc ON doc.id = o.doctor_id
			LEFT JOIN table5 d ON d.AID = o.discount_id
			LEFT JOIN table6 k ON k.[Key]=o.partner_id 
WHERE o.visit_date &gt;= @P1 AND o.visit_date &lt;= @P2 AND p.last_name+' '+p.first_name+' '+p.middle_name like @P3
ORDER BY o.status, o.visit_date, o.visit_time ASC   </inputbuf>
  </process>
  <process id="processbb3c06fc28" taskpriority="0" logused="10000" waittime="2477" schedulerid="11" kpid="19692" status="suspended" spid="329" sbid="1" ecid="2" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="priklad-12" hostpid="0" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="3" stmtstart="164" stmtend="1862" sqlhandle="0x02000000428fd42cd8f4fad83ab358d1900f3ce6206f5a550000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))SET DATEFORMAT dmy;

			SELECT 
				o.*,
				u.name as nurse,
				p.first_name, 
				p.middle_name, 
				p.last_name, 
				p.birthday,
				CAST(d.Discount AS nvarchar(50))+'% - '+d.DiscountName as discount, k.Name as partner,
				CASE WHEN (o.visit_date &lt;= convert(date, GETDATE()) AND o.status &lt; 2) OR (o.visit_date &lt; convert(date, GETDATE()) AND o.status = 2)
					THEN 1
					ELSE 0
				END AS timeoff,
				k.name as kontragentName
			FROM table1 o
			LEFT JOIN table2 p ON p.id = o.patient_id
			LEFT JOIN table3 u ON u.id=o.nurse_id
			LEFT JOIN table4 doc ON doc.id = o.doctor_id
			LEFT JOIN table5 d ON d.AID = o.discount_id
			LEFT JOIN table6 k ON k.[Key]=o.partner_id 
WHERE o.visit_date &gt;= @P1 AND o.visit_date &lt;= @P2 AND p.last_name+' '+p.first_name+' '+p.middle_name like @P3
ORDER BY o.status, o.visit_date, o.visit_time ASC   </inputbuf>
  </process>
  <process id="process6abc037468" taskpriority="0" logused="10000" waittime="2477" schedulerid="8" kpid="9868" status="suspended" spid="329" sbid="1" ecid="1" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="priklad-12" hostpid="0" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="3" stmtstart="164" stmtend="1862" sqlhandle="0x02000000428fd42cd8f4fad83ab358d1900f3ce6206f5a550000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))SET DATEFORMAT dmy;

			SELECT 
				o.*,
				u.name as nurse,
				p.first_name, 
				p.middle_name, 
				p.last_name, 
				p.birthday,
				CAST(d.Discount AS nvarchar(50))+'% - '+d.DiscountName as discount, k.Name as partner,
				CASE WHEN (o.visit_date &lt;= convert(date, GETDATE()) AND o.status &lt; 2) OR (o.visit_date &lt; convert(date, GETDATE()) AND o.status = 2)
					THEN 1
					ELSE 0
				END AS timeoff,
				k.name as kontragentName
			FROM table1 o
			LEFT JOIN table2 p ON p.id = o.patient_id
			LEFT JOIN table3 u ON u.id=o.nurse_id
			LEFT JOIN table4 doc ON doc.id = o.doctor_id
			LEFT JOIN table5 d ON d.AID = o.discount_id
			LEFT JOIN table6 k ON k.[Key]=o.partner_id 
WHERE o.visit_date &gt;= @P1 AND o.visit_date &lt;= @P2 AND p.last_name+' '+p.first_name+' '+p.middle_name like @P3
ORDER BY o.status, o.visit_date, o.visit_time ASC   </inputbuf>
  </process>
  <process id="processbb3c0768c8" taskpriority="0" logused="0" waitresource="KEY: 9:72057596710289408 (828781b99285)" waittime="2477" ownerId="54905556086" transactionname="SELECT" lasttranstarted="2020-11-17T08:18:34.747" XDES="0x6306cd2960" lockMode="S" schedulerid="12" kpid="20304" status="suspended" spid="329" sbid="1" ecid="3" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="priklad-12" hostpid="0" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="3" stmtstart="164" stmtend="1862" sqlhandle="0x02000000428fd42cd8f4fad83ab358d1900f3ce6206f5a550000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))SET DATEFORMAT dmy;

			SELECT 
				o.*,
				u.name as nurse,
				p.first_name, 
				p.middle_name, 
				p.last_name, 
				p.birthday,
				CAST(d.Discount AS nvarchar(50))+'% - '+d.DiscountName as discount, k.Name as partner,
				CASE WHEN (o.visit_date &lt;= convert(date, GETDATE()) AND o.status &lt; 2) OR (o.visit_date &lt; convert(date, GETDATE()) AND o.status = 2)
					THEN 1
					ELSE 0
				END AS timeoff,
				k.name as kontragentName
			FROM table1 o
			LEFT JOIN table2 p ON p.id = o.patient_id
			LEFT JOIN table3 u ON u.id=o.nurse_id
			LEFT JOIN table4 doc ON doc.id = o.doctor_id
			LEFT JOIN table5 d ON d.AID = o.discount_id
			LEFT JOIN table6 k ON k.[Key]=o.partner_id 
WHERE o.visit_date &gt;= @P1 AND o.visit_date &lt;= @P2 AND p.last_name+' '+p.first_name+' '+p.middle_name like @P3
ORDER BY o.status, o.visit_date, o.visit_time ASC   </inputbuf>
  </process>
  <process id="process943a6b28c8" taskpriority="0" logused="452" waitresource="PAGE: 9:1:127149510 " waittime="2547" ownerId="54905549280" transactionname="UPDATE" lasttranstarted="2020-11-17T08:18:34.523" XDES="0x8fb86d8420" lockMode="IX" schedulerid="64" kpid="14236" status="suspended" spid="428" sbid="1" ecid="0" priority="0" trancount="2" lastbatchstarted="2020-11-17T08:18:34.527" lastbatchcompleted="2020-11-17T08:18:34.527" lastattention="1900-01-01T00:00:00.527" hostname="priklad-05" hostpid="0" loginname="login" isolationlevel="read committed (2)" xactid="54905549280" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="396" stmtend="870" sqlhandle="0x020000007954ae38890048dc24ce164761443b0a0444eab50000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 nvarchar(4000),@P5 nvarchar(4000),@P6 nvarchar(4000),@P7 char(1),@P8 char(1),@P9 nvarchar(4000))SET DATEFORMAT dmy; update table1 set [discount_id]=@P1, [delivery_address]=@P2, [user_id]=@P3, [phone]=@P4, [mobile]=@P5, [email]=@P6, [preferred_pay_type]=@P7, [formal_confirmation]=@P8, [complete_dt]=@P9 where [id]='369112'   </inputbuf>
  </process>
  <process id="processbb3bb81c28" taskpriority="0" logused="10000" waittime="2588" schedulerid="30" kpid="17780" status="suspended" spid="329" sbid="1" ecid="0" priority="0" trancount="0" lastbatchstarted="2020-11-17T08:18:34.760" lastbatchcompleted="2020-11-17T08:18:34.710" lastattention="1900-01-01T00:00:00.710" hostname="priklad-12" hostpid="0" loginname="login" isolationlevel="read committed (2)" xactid="54905556086" currentdb="9" currentdbname="DataBase" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="3" stmtstart="164" stmtend="1862" sqlhandle="0x02000000428fd42cd8f4fad83ab358d1900f3ce6206f5a550000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000))SET DATEFORMAT dmy;

			SELECT 
				o.*,
				u.name as nurse,
				p.first_name, 
				p.middle_name, 
				p.last_name, 
				p.birthday,
				CAST(d.Discount AS nvarchar(50))+'% - '+d.DiscountName as discount, k.Name as partner,
				CASE WHEN (o.visit_date &lt;= convert(date, GETDATE()) AND o.status &lt; 2) OR (o.visit_date &lt; convert(date, GETDATE()) AND o.status = 2)
					THEN 1
					ELSE 0
				END AS timeoff,
				k.name as kontragentName
			FROM table1 o
			LEFT JOIN table2 p ON p.id = o.patient_id
			LEFT JOIN table3 u ON u.id=o.nurse_id
			LEFT JOIN table4 doc ON doc.id = o.doctor_id
			LEFT JOIN table5 d ON d.AID = o.discount_id
			LEFT JOIN table6 k ON k.[Key]=o.partner_id 
WHERE o.visit_date &gt;= @P1 AND o.visit_date &lt;= @P2 AND p.last_name+' '+p.first_name+' '+p.middle_name like @P3
ORDER BY o.status, o.visit_date, o.visit_time ASC   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <exchangeEvent id="Portbb31ab8e00" WaitType="e_waitPortOpen" waiterType="Producer" nodeId="1" tid="2" ownerActivity="notYetOpened" waiterActivity="waitForAllOwnersToOpen">
   <owner-list>
    <owner id="processbb3c06fc28" />
   </owner-list>
   <waiter-list>
    <waiter id="processbb3c067848" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Portbb31ab8e00" WaitType="e_waitPortOpen" waiterType="Producer" nodeId="1" tid="3" ownerActivity="notYetOpened" waiterActivity="waitForAllOwnersToOpen">
   <owner-list>
    <owner id="processbb3c0768c8" />
   </owner-list>
   <waiter-list>
    <waiter id="processbb3c06fc28" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Portbb31ab8e00" WaitType="e_waitPortOpen" waiterType="Producer" nodeId="1" tid="1" ownerActivity="notYetOpened" waiterActivity="waitForAllOwnersToOpen">
   <owner-list>
    <owner id="processbb3c067848" />
   </owner-list>
   <waiter-list>
    <waiter id="process6abc037468" />
   </waiter-list>
  </exchangeEvent>
  <keylock hobtid="72057596710289408" dbid="9" objectname="DataBase.dbo.table1" indexname="PK_table1" id="lock7ea2ba2280" mode="X" associatedObjectId="72057596710289408">
   <owner-list>
    <owner id="process943a6b28c8" mode="X" />
   </owner-list>
   <waiter-list>
    <waiter id="processbb3c0768c8" mode="S" requestType="wait" />
   </waiter-list>
  </keylock>
  <pagelock fileid="1" pageid="127149510" dbid="9" subresource="FULL" objectname="DataBase.dbo.table1" id="lock7893bba680" mode="S" associatedObjectId="72057596807151616">
   <owner-list>
    <owner id="processbb3bb81c28" mode="S" />
   </owner-list>
   <waiter-list>
    <waiter id="process943a6b28c8" mode="IX" requestType="wait" />
   </waiter-list>
  </pagelock>
  <exchangeEvent id="Portbb31ab8e00" WaitType="e_waitPortOpen" waiterType="Coordinator" nodeId="1" tid="0" ownerActivity="notYetOpened" waiterActivity="waitForAllOwnersToOpen">
   <owner-list>
    <owner id="process6abc037468" />
   </owner-list>
   <waiter-list>
    <waiter id="processbb3bb81c28" />
   </waiter-list>
  </exchangeEvent>
 </resource-list>
</deadlock>

...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019964
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
У вас дедлоки внутри одного запроса с параллелизмом.

+1

Danion, покажите select @@version с сервера

priklad-05 должен был выиграть этот дедлок и пойти дальше

забавная параметризация у запроса (сессия 428)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE table1
SET [discount_id] = @P1
	,[delivery_address] = @P2
	,[user_id] = @P3
	,[phone] = @P4
	,[mobile] = @P5
	,[email] = @P6
	,[preferred_pay_type] = @P7
	,[formal_confirmation] = @P8
	,[complete_dt] = @P9
WHERE [id] = '369112'

...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019968
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

У вас не self-deadlock, а банальный дедлок читателя с писателем из-за разного порядка блокировок строк/страниц.
И если запрос-жертва продолжает выполняться, значит физически жертвой стал один из потоков параллельного запроса.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019972
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Версия:
Microsoft SQL Server 2017 (RTM-CU21) (KB4557397) - 14.0.3335.7 (X64) Jun 12 2020 20:39:00 Copyright (C) 2017 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

Параметризацию коллеги из разработки осваивают, пока бывает странное. Там действительно для id напрашивается.

"У вас не self-deadlock, а банальный дедлок читателя с писателем из-за разного порядка блокировок строк/страниц.
И если запрос-жертва продолжает выполняться, значит физически жертвой стал один из потоков параллельного запроса."

Вот мне и кажется, что дедлок между двумя разными запросами, но мне пишут, что дедлок внутри запроса с параллелизмом.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019994
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion
остальное не трогал.

Да, разные сессии.

Проверяйте статистику и планы запросов. Скорее всего пересекаетесь на рандомных seek и последовательном scan.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40019997
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

по сути у вас такая, ситуация.


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


блин как прикрепленную картинку в спойлер пихнуть?
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40092517
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Несколько раз уже повторялись подобные ситуации. Проблема в том, что сам сервер вообще не может справиться с ситуацией. Часами висят блокировки в две сессии с дедлоками, особенно плохо, если такое происходит во вне рабочее время. В extended events видно, что сервер пытается убить одну из сессий, хотя больше похоже на попытку убить один из потоков сессии с параллелизмом и не может.
При этом человек через kill session_id спокойно убирает проблему.
Есть какие-то варианты помочь серверу самому справляться с такими дедлоками? Убирать параллелизм для всего сервера не вариант.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40092522
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты
1. Таки обновить сервер последним апдейтом.
2. Таки убрать параллелизм с ЭТОГО запроса, если всегда один и тот же запрос.
3. Таки выставить SET LOCK_TIMEOUT nnnn; для этого запроса.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40092523
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

2017 CU24 сейчас. Пару раз уже обновляли с CU с момента первой встречи подобной ситуации на системе, но улучшений нет. Да и в списке исправлений там похожего не видел.
Запросы разные. Встреченные переделывали, ситуация была не очень часто, а на этой неделе уже второй раз такое.
Вот и интересуют варианты для устранения ситуаций в будущем с похожими симптомами, но разными запросами.
Сейчас на сервере нет дополнительных приспособлений для убийства долго выполняющихся сессий\блокировок, но если будет часто повторяться, то придётся что-то придумывать и добавлять.
При этом по не видно что там дедлок sys.sysprocesses, одну из сессий показывает, что просто в CXPACKET ждёт, дополнительный мониторинг тоже не очень этот момент показывает.
Виден дедлок через extended events и руками через sp_WhoIsActive. Обычно не используем автокилы, чтобы случайно чего лишнего не убрало, в данной ситуации ещё и определять в автоматическом режиме сложнее, половина способов не видит, что это дедлок и сервер уже встал в тысячах блокировок.
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40092528
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

Не вы один с такой проблемой - https://docs.microsoft.com/en-us/answers/questions/375485/unhandled-deadlocks-with-sql-server-2017.html

1. Если можно менять запросы, попробуйте в select для table1 указать rowlock.
2. Менять maxdop для всего сервера не требуется. Можно указать для запроса option (maxdop 1). Или через plan guide - https://docs.microsoft.com/en-us/sql/relational-databases/performance/plan-guides?view=sql-server-ver15

Даже без параллелизма ситуация все равно потенциально дедлочная: у читателя гранулярность блокировок - страница, а у писателя - строка.

И желательно все-таки увидеть актуальный план select'а
...
Рейтинг: 0 / 0
При deadlock не прошло автоматическое снятие сессии
    #40092546
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Danion,

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


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