Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
Добрый день.

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

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

С чем может быть связано то, что SQL Server не смог убить участника дедлока и блокировки продолжались до вмешательства человека?

К сообщению приложен файл. Размер - 79Kb
17 ноя 20, 09:50    [22233506]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
Сессия одна. У вас дедлоки внутри одного запроса с параллелизмом. Поэтому убивать нечего.
Лечение "в лоб" - выставить для запроса maxdop 1
17 ноя 20, 10:08    [22233517]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
invm,

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

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

Сообщение было отредактировано: 17 ноя 20, 10:17
17 ноя 20, 10:17    [22233521]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
Danion,

Можно ещё попробовать проанализировать, на чём возникает кривое распределение по потокам и попробовать привести данные к более параллелизуемому виду.
17 ноя 20, 10:18    [22233522]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
Попытка добавить общий скрин, но плохое качество деталей.

К сообщению приложен файл. Размер - 54Kb
17 ноя 20, 10:24    [22233526]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Yasha123
Member

Откуда:
Сообщений: 1929
Danion

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

так не лепите граф картинкой, приведите текстом, можно в спойлере
17 ноя 20, 11:03    [22233549]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
Yasha123,
На схему вроде удобно смотреть для наглядности и её удалось выложить. В тексте много имён серверов, баз данных, таблиц и прочей информации, которую я бы предпочёл не указывать. Что никто не сталкивался с подобным?
17 ноя 20, 11:59    [22233602]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
Danion,

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

Дедлоки на exchange event при ожиданиях cxpacket явно показывают, что проблема с распределением данных в потоках. Либо убивайте параллелизм, либо ищите как выровнять распределение (от банального on t1.id = t2.id + 0 , до ручных статистик и предварительных сортировок)

Сообщение было отредактировано: 17 ноя 20, 12:30
17 ноя 20, 12:33    [22233627]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
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.
17 ноя 20, 12:45    [22233641]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
Danion,

Отловите "в моменте" и убедитесь, что это не сессии координатора и слейва.
17 ноя 20, 12:54    [22233651]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
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, а конкретный поток? Мне казалось, что нет, но пока в данной ситуации похоже именно на такую попытку.
17 ноя 20, 13:25    [22233671]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
Danion
env,
А SQL Server вообще может пытаться убить не всю сессию 329, а конкретный поток? Мне казалось, что нет, но пока в данной ситуации похоже именно на такую попытку.


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

взаимоблокировки связанные с параллелизмом в принципе известны (можете погуглить что то типа intra-query deadlock).
Поскольку механизм разрешения взаимоблокировок не реагирует именно на ситуации в параллельными взаимоблокировками решаются такие проблемы обычно анализом "а нужен ли вообще в том запросе параллелизм" и снижением степени для его возникновения.
18 ноя 20, 02:08    [22234301]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
felix_ff,

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

В данной ситуации основная проблема не в том, что вообще произошёл дедлок (это печально, но бывает), а в том, что SQL Server не смог сам убрать одну из сессий участников. Когда руками была убрана вторая сессия, то 329 с параллелизмом спокойно завершилась.
18 ноя 20, 13:40    [22234568]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
Danion,

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

если у вас была взаимоблокировка intra-query parallel thread то сиквел сам такие взаимоблокировки не разрешает.
18 ноя 20, 13:45    [22234572]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
felix_ff,

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

+
<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>
18 ноя 20, 14:14    [22234590]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
komrad
Member

Откуда:
Сообщений: 5345
invm
У вас дедлоки внутри одного запроса с параллелизмом.

+1

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

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

+ забавная параметризация у запроса (сессия 428)
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'
18 ноя 20, 15:05    [22234650]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
Danion,

У вас не self-deadlock, а банальный дедлок читателя с писателем из-за разного порядка блокировок строк/страниц.
И если запрос-жертва продолжает выполняться, значит физически жертвой стал один из потоков параллельного запроса.
18 ноя 20, 15:11    [22234655]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
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, а банальный дедлок читателя с писателем из-за разного порядка блокировок строк/страниц.
И если запрос-жертва продолжает выполняться, значит физически жертвой стал один из потоков параллельного запроса."

Вот мне и кажется, что дедлок между двумя разными запросами, но мне пишут, что дедлок внутри запроса с параллелизмом.
18 ноя 20, 15:21    [22234659]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
Danion
остальное не трогал.

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

Проверяйте статистику и планы запросов. Скорее всего пересекаетесь на рандомных seek и последовательном scan.
18 ноя 20, 15:46    [22234689]     Ответить | Цитировать Сообщить модератору
 Re: При deadlock не прошло автоматическое снятие сессии  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
Danion,

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


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

+

блин как прикрепленную картинку в спойлер пихнуть?


К сообщению приложен файл. Размер - 113Kb


Сообщение было отредактировано: 18 ноя 20, 15:47
18 ноя 20, 15:49    [22234693]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить