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

Прошу помощи с deadlock-ом. Deadlock graph присоединен в виде файла.
SQL Server 2008 R2.

Если нужны какие-то еще дополнительные данные - сообщите.
15 июн 16, 16:41    [19296411]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
Deadlock_graph.xml не присоединился в предыдущем сообщении. Вот он ниже

+ Deadlock Graph

<EVENT_INSTANCE>
	<EventType>DEADLOCK_GRAPH</EventType>
	<PostTime>2016-06-14T04:01:42.500</PostTime>
	<SPID>22</SPID>
	<TextData>
		<deadlock-list>
			<deadlock victim="process2d54c6748">
				<process-list>
					<process id="process2d54c6748" taskpriority="0" logused="644" waitresource="KEY: 9:72057606885277696 (acbac7698aab)" waittime="2448" ownerId="3511978096" transactionname="user_transaction" lasttranstarted="2016-06-14T04:01:39.503" XDES="0x479280df0" lockMode="U" schedulerid="8" kpid="141012" status="suspended" spid="102" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-06-14T04:01:39.800" lastbatchcompleted="2016-06-14T04:01:39.680" clientapp=".Net SqlClient Data Provider" hostname="395784-WEB01" hostpid="14916" loginname="dspUser" isolationlevel="read uncommitted (1)" xactid="3511978096" currentdb="9" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
						<executionStack>
							<frame procname="adhoc" line="1" stmtstart="494" sqlhandle="0x0200000049324c171f11272b4901dabb3efa33bb45b6e813"> UPDATE [XXXXXX].[dbo].[attribute_value] SET [active] = @p0, [changedby] = @p1, [changedon] = @p2, [change_source] = @p3, [comscore_id] = @p4, [createdby] = @p5, [createdon] = @p6, [description] = @p7, [max_range] = @p8, [min_range] = @p9, [network_imp_pct] = @p10, [value] = @p11, [code] = @p12, [lookup_locale_id] = @p13, [attribute_id] = @p14, [attribute_value_id] = @p15 WHERE [attribute_value_id] = @p16     </frame>
							<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000"> unknown     </frame>
						</executionStack>
						<inputbuf> (@p0 bit,@p1 uniqueidentifier,@p2 datetime,@p3 nvarchar(4000),@p4 int,@p5 uniqueidentifier,@p6 datetime,@p7 nvarchar(4000),@p8 int,@p9 int,@p10 decimal(28,5),@p11 nvarchar(4000),@p12 nvarchar(4000),@p13 uniqueidentifier,@p14 int,@p15 int,@p16 int)UPDATE [XXXXXX].[dbo].[attribute_value] SET [active] = @p0, [changedby] = @p1, [changedon] = @p2, [change_source] = @p3, [comscore_id] = @p4, [createdby] = @p5, [createdon] = @p6, [description] = @p7, [max_range] = @p8, [min_range] = @p9, [network_imp_pct] = @p10, [value] = @p11, [code] = @p12, [lookup_locale_id] = @p13, [attribute_id] = @p14, [attribute_value_id] = @p15 WHERE [attribute_value_id] = @p16    </inputbuf>
					</process>
					<process id="process84224bc8" taskpriority="0" logused="5152" waitresource="KEY: 9:72057606885277696 (b5c28271ab1b)" waittime="2444" ownerId="3511977965" transactionname="user_transaction" lasttranstarted="2016-06-14T04:01:39.437" XDES="0x32881ca70" lockMode="U" schedulerid="8" kpid="153760" status="suspended" spid="327" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-06-14T04:01:39.800" lastbatchcompleted="2016-06-14T04:01:39.677" clientapp=".Net SqlClient Data Provider" hostname="395784-WEB01" hostpid="14916" loginname="dspUser" isolationlevel="read uncommitted (1)" xactid="3511977965" currentdb="9" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
						<executionStack>
							<frame procname="adhoc" line="1" stmtstart="494" sqlhandle="0x0200000049324c171f11272b4901dabb3efa33bb45b6e813"> UPDATE [AN_MAIN].[dbo].[attribute_value] SET [active] = @p0, [changedby] = @p1, [changedon] = @p2, [change_source] = @p3, [comscore_id] = @p4, [createdby] = @p5, [createdon] = @p6, [description] = @p7, [max_range] = @p8, [min_range] = @p9, [network_imp_pct] = @p10, [value] = @p11, [code] = @p12, [lookup_locale_id] = @p13, [attribute_id] = @p14, [attribute_value_id] = @p15 WHERE [attribute_value_id] = @p16     </frame>
							<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000"> unknown     </frame>
						</executionStack>
						<inputbuf> (@p0 bit,@p1 uniqueidentifier,@p2 datetime,@p3 nvarchar(4000),@p4 int,@p5 uniqueidentifier,@p6 datetime,@p7 nvarchar(4000),@p8 int,@p9 int,@p10 decimal(28,5),@p11 nvarchar(4000),@p12 nvarchar(4000),@p13 uniqueidentifier,@p14 int,@p15 int,@p16 int)UPDATE [XXXXXX].[dbo].[attribute_value] SET [active] = @p0, [changedby] = @p1, [changedon] = @p2, [change_source] = @p3, [comscore_id] = @p4, [createdby] = @p5, [createdon] = @p6, [description] = @p7, [max_range] = @p8, [min_range] = @p9, [network_imp_pct] = @p10, [value] = @p11, [code] = @p12, [lookup_locale_id] = @p13, [attribute_id] = @p14, [attribute_value_id] = @p15 WHERE [attribute_value_id] = @p16    </inputbuf>
					</process>
				</process-list>
				<resource-list>
					<keylock hobtid="72057606885277696" dbid="9" objectname="XXXXXX.dbo.attribute_value" indexname="PK_attribute_value" id="lock16d912680" mode="X" associatedObjectId="72057606885277696">
						<owner-list>
							<owner id="process84224bc8" mode="X"/>
						</owner-list>
						<waiter-list>
							<waiter id="process2d54c6748" mode="U" requestType="wait"/>
						</waiter-list>
					</keylock>
					<keylock hobtid="72057606885277696" dbid="9" objectname="XXXXXX.dbo.attribute_value" indexname="PK_attribute_value" id="lock1a28cc980" mode="X" associatedObjectId="72057606885277696">
						<owner-list>
							<owner id="process2d54c6748" mode="X"/>
						</owner-list>
						<waiter-list>
							<waiter id="process84224bc8" mode="U" requestType="wait"/>
						</waiter-list>
					</keylock>
				</resource-list>
			</deadlock>
		</deadlock-list>
	</TextData>
	<TransactionID/>
	<LoginName>sa</LoginName>
	<StartTime>2016-06-14T04:01:42.407</StartTime>
	<ServerName>XXXXXXXXXXXXXXXX</ServerName>
	<LoginSid>AQ==</LoginSid>
	<EventSequence>52262660</EventSequence>
	<IsSystem>1</IsSystem>
	<SessionLoginName/>
</EVENT_INSTANCE>

15 июн 16, 16:47    [19296467]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Примерно то же самое, что тут
Только у вас в параллельных транзакциях изменяются строки с пересекающимися значениями attribute_value_id, но в разном порядке.
15 июн 16, 18:06    [19296987]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
invm,

А можно у Вас попросить еще пояснений. Просто поле attribute_value_id - это clustered primary key в таблице.
И я что-то не совсем понимаю логику наложения блокировок в этом случае.


+ пытаюсь понять X-блокировки ниже. Это 2 лежащие X блокировки на один ресурс? Вообщем что-то я не так тут понимаю, а выйти на правильное понимание не могу.

<keylock hobtid="72057606885277696" dbid="9" objectname="XXXXXX.dbo.attribute_value" indexname="PK_attribute_value" id="lock16d912680" mode="X" associatedObjectId="72057606885277696">



<keylock hobtid="72057606885277696" dbid="9" objectname="XXXXXX.dbo.attribute_value" indexname="PK_attribute_value" id="lock1a28cc980" mode="X" associatedObjectId="72057606885277696">


Заранее благодарен.
15 июн 16, 20:01    [19297315]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
ппп-пп
+ пытаюсь понять X-блокировки ниже. Это 2 лежащие X блокировки на один ресурс?

кажись это все-таки разные строки. это я неправильно интерпретирую Hobt ID.

+ мне кажется, что если в транзакцию были вовлченые только update statements, то deadlock-а не должно быть. Или я тут ошибаюсь?
15 июн 16, 20:15    [19297346]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
Как мне кажется изначально X-lock может появляться не от Update, а от INSERT.

Стукните меня по голове, если я пишу полную чушь.
15 июн 16, 20:19    [19297357]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ппп-пп
И я что-то не совсем понимаю логику наложения блокировок в этом случае.
Если у вас изменяется значение столбца, входящего в некластерный индекс, то как раз будет сначала накладываться U, а потом X.
Потому что в плане выполнения сначала выполняется Clustered Index Seek (накладывает U), а потом Clustered Index Update (накладывает X).
Если бы другие индексы изменять не требовалось, в плане был бы просто Clustered Index Update и, соответственно, сразу бы накладывалась X.

Но это не важно. При X будет такой же дедлок.

ппп-пп
Это 2 лежащие X блокировки на один ресурс?
Нет. Ресурсы разные - lock16d912680 и lock1a28cc980
Какие именно ресурсы прописано в process-list - waitresource="KEY: 9:72057606885277696 (acbac7698aab)" и waitresource="KEY: 9:72057606885277696 (b5c28271ab1b)"
15 июн 16, 20:55    [19297455]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
invm
Если у вас изменяется значение столбца, входящего в некластерный индекс, то как раз будет сначала накладываться U, а потом X.
Потому что в плане выполнения сначала выполняется Clustered Index Seek (накладывает U), а потом Clustered Index Update (накладывает X).
Если бы другие индексы изменять не требовалось, в плане был бы просто Clustered Index Update и, соответственно, сразу бы накладывалась X.

Но это не важно. При X будет такой же дедлок.


Мне просто всегда казалось, что U блокировка должна накладываеться всегда перед X при UPDATE.
"To avoid this potential deadlock problem, update (U) locks are used. Only one transaction can obtain an update (U) lock to a resource at a time. If a transaction modifies a resource, the update (U) lock is converted to an exclusive (X) lock."

В моем же случае, сначала идут X, а затем запрашивается U.
Вот я пытаюсь понять, откуда могут появится X блокировки. Неужели выполнение однотипного update на уровне одной строки PK (пусть даже в транзакции может быть несколько таких UPDATE) может приводить к deadlock. Ведь должна блокироваться именно строка.

Опять же, возможно, я пишу полную чушь и меня надо сильно стукнуть по голове. Но я пока только так могу выразить свое непонимание.
15 июн 16, 21:16    [19297504]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
invm
Нет. Ресурсы разные - lock16d912680 и lock1a28cc980
Какие именно ресурсы прописано в process-list - waitresource="KEY: 9:72057606885277696 (acbac7698aab)" и waitresource="KEY: 9:72057606885277696 (b5c28271ab1b)"


Спасибо за подсказку в этом. Уже разобрался.
15 июн 16, 21:16    [19297510]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ппп-пп
В моем же случае, сначала идут X, а затем запрашивается U.
Нет.
Как и полагается, сначала идет попытка наложить U - <waiter id="process2d54c6748" mode="U" requestType="wait"/>
Что невозможно, т.к. другой процесс удерживает X на это же ресурс - <owner id="process84224bc8" mode="X"/>
15 июн 16, 22:01    [19297723]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
ппп-пп
Guest
invm,

Кажись разобрался. Также, как вы и писали, если нет индексов на таблице - сразу накладывается X.
16 июн 16, 12:29    [19299788]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с deadlock-ом  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ппп-пп
если нет индексов на таблице - сразу накладывается X
Влияет не само наличие индексов, а обновление столбцов, входящих в ключи этих индексов.
Т.к. изменение ключа индекса операция дорогая, оптимизатор строит план, позволяющий определить изменялись ли фактически значения в таких столбцах и в зависимости от результата обновлять соответствующие индексы или нет.
Поэтому в плане выполнения у вас сначала будет Clustered Index Seek (U), затем Clustered Index Update (X)
16 июн 16, 12:50    [19299883]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить