Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Суть вкрадце:
1. Есть вьюха из нее регулярно все читают при read_uncommitted - по сути инфа клиенты на карте... пох - грязное чтение норм в этом случае. Сайтом пользуется много народу - чтения идут постоянно и интенсивно.
2. Накатываем 1-2 раза в неделю миграцию. В этой миграции апдейт этой вьюхи. Написано правда через делит креат, не через апдейт, но пох пока так.

Граф дидлока на картинке и во вложении ниже.
Как блеять избежать этого дидлока? Понятно что остановка сервисов и накатывание обновлений спасет отца русской демократии, но руковдство это не хочет - нужно решение что бы обновлять миграции без останова сервиса.

+ graph
<TextData>
  <deadlock-list>
 <deadlock victim="process36ccc7c108">
  <process-list>
   <process id="process36ccc7c108" taskpriority="0" logused="0" waitresource="OBJECT: 8:2135125563:3 " waittime="4292" ownerId="47999405989" transactionname="user_transaction" lasttranstarted="2016-12-08T18:50:39.743" XDES="0x716a28540" lockMode="Sch-S" schedulerid="4" kpid="150140" status="suspended" spid="348" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2016-12-08T18:51:01.687" lastbatchcompleted="2016-12-08T18:51:01.683" lastattention="1900-01-01T00:00:00.683" clientapp=".Net SqlClient Data Provider" hostname="A11" hostpid="8148" loginname="YOUDO\daemon" isolationlevel="read uncommitted (1)" xactid="47999405989" currentdb="8" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="146" stmtend="3114" sqlhandle="0x02000000ae2c0107e596c1c0b98b06bee5c178884b10cf620000000000000000000000000000000000000000">
unknown     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@p1 int,@p2 int,@userId int,@polygon nvarchar(184),@userId1 int,@p3 int)SELECT
	[task1].[Id],
	[task1].[AvatarId],
	[task1].[CreatorId],
	[task1].[Amount],
	[task1].[PriceRangeId],
	[task1].[Category],
	[task1].[DateNeedBegin],
	[task1].[DateNeedEnd],
	[task1].[State] as [State1],
	[task1].[IsPrivate],
	[task1].[City],
	[task1].[Name],
	[address].[AddressString],
	[address].[Long] as [Long1],
	[address].[Lat],
	[creator].[Name] as [Name1],
	[creator].[Lastname],
	[creator].[AvatarId] as [AvatarId1],
	[stat].[PositiveReviewsNumber],
	[stat].[NegativeReviewsNumber],
	IIF([utv].[UserId] IS NULL AND [utv].[TaskId] IS NULL, NULL, [utv].[LastViewDate]) as [c1],
	[task1].[SubcategoryId],
	[task1].[RegularState],
	[task1].[FeeFree],
	[o].[ShowCreatorPhone]
FROM
	[dbo].[AllTasks] [task1]
		INNER JOIN [dbo].[TaskAddress] [address] ON [task1].[Id] = [address].[TaskId] AND 0 = [address].[Order]
		INNER JOIN [dbo].[Users] [creator] ON [task1].[CreatorId] = [creator].[Id]
		LEFT JOIN [dbo].[    </inputbuf>
   </process>
   <process id="processd4a0009088" taskpriority="0" logused="63168" waitresource="OBJECT: 8:1584171605:3 " waittime="4271" ownerId="47999543918" transactionname="user_transaction" lasttranstarted="2016-12-08T18:51:01.530" XDES="0x400c69f1c0" lockMode="Sch-M" schedulerid="20" kpid="121408" status="suspended" spid="121" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2016-12-08T18:51:01.730" lastbatchcompleted="2016-12-08T18:51:01.723" lastattention="1900-01-01T00:00:00.723" clientapp=".Net SqlClient Data Provider" hostname="SQL01" hostpid="143492" loginname="YOUDO\akordubaylo" isolationlevel="read committed (2)" xactid="47999543918" currentdb="8" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="2" stmtstart="88" stmtend="140" sqlhandle="0x0200000020b72524fe1ed27e6c6845f12a39760b4c4bc87e0000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
IF OBJECT_ID ('AllTasks', 'V') IS NOT NULL
	DROP VIEW [dbo].[AllTasks]
    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <objectlock lockPartition="3" objid="2135125563" subresource="FULL" dbid="8" objectname="YouDo.dbo.VerifiedUsersData" id="lock359b012b00" mode="Sch-M" associatedObjectId="2135125563">
    <owner-list>
     <owner id="processd4a0009088" mode="Sch-M" />
    </owner-list>
    <waiter-list>
     <waiter id="process36ccc7c108" mode="Sch-S" requestType="wait" />
    </waiter-list>
   </objectlock>
   <objectlock lockPartition="3" objid="1584171605" subresource="FULL" dbid="8" objectname="YouDo.dbo.AllTasks" id="lock4e7b222880" mode="X" associatedObjectId="1584171605">
    <owner-list>
     <owner id="process36ccc7c108" mode="Sch-S" />
    </owner-list>
    <waiter-list>
     <waiter id="processd4a0009088" mode="Sch-M" requestType="convert" />
    </waiter-list>
   </objectlock>
  </resource-list>
 </deadlock>
</deadlock-list>
</TextData>


К сообщению приложен файл. Размер - 70Kb
9 дек 16, 10:10    [19983368]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
print @@version

Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 
Apr 20 2015 17:29:27
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
9 дек 16, 10:12    [19983383]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
aleks2
Guest
Отца русской дерьмократии ничего не спасет.

Но можно попробовать
sp_Rename View to oldView
create View
drop oldView

Хотя - очень маловероятно. У мя подозрение, что переименование - тоже катастрофа.
9 дек 16, 10:23    [19983434]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Как минимум, нужно попробовать через alter или rename. Если там все равно Sch-S -> Sch-M, то тогда понижаете deadlock_priority для скрипта пересоздания вьюхи и делаете реран в случае дедлока пока не проскочит.
9 дек 16, 10:54    [19983589]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Дед-Папыхтет,

вы пытаетесь вытащить нижнюю тарелку из стопки :) Останавливайте/блокируйте сервис (все-то не надо!), который юзает эту вьюху, обновляйте и стартуйте. Одна секунда ООС ничего не решит. Никто даже не поймет, что случалось. Ставьте обновление отдельной задачей.
9 дек 16, 11:00    [19983627]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Зачем вы её вообще обновляете?
9 дек 16, 11:02    [19983636]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
А, да, вы явно что-то не договариваете, потому что у вас в якобы только читающая с nolock транзация хочет блокировку objectname="YouDo.dbo.VerifiedUsersData" mode="Sch-M"

Сообщение было отредактировано: 9 дек 16, 11:03
9 дек 16, 11:02    [19983639]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
Дед-Папыхтет,

1. Ваша "миграция" делается в транзакции.
2. При read uncommitted на объекты накладывается Sch-S

Порядок наложения Sch-M на объекты в "миграции" не совпадает с порядком наложения Sch-S на объекты в запросе. Отсюда и дедлок.

Способ лечения - отказаться от read uncommitted и включить RCSI.
9 дек 16, 11:05    [19983655]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Гавриленко Сергей Алексеевич
А, да, вы явно что-то не договариваете, потому что у вас в якобы только читающая с nolock транзация хочет блокировку objectname="YouDo.dbo.VerifiedUsersData" mode="Sch-M"

вижу что Sch-M... что эту блокировку генерирует я без понятия... И шарписты разработчики ничего сказать не могут...
на тему заменить дроп-креат на альтер - ну да... первая мысль в этом и была... один фиг блокировка Sch-М будет... не понимаю поможет это в ситуации или нет. Единственно что можно "попробовать" вдруг прокатит
9 дек 16, 11:07    [19983665]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Может там схемабиндинг где-то.
9 дек 16, 11:14    [19983706]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Дед-Папыхтет
Гавриленко Сергей Алексеевич
А, да, вы явно что-то не договариваете, потому что у вас в якобы только читающая с nolock транзация хочет блокировку objectname="YouDo.dbo.VerifiedUsersData" mode="Sch-M"

вижу что Sch-M... что эту блокировку генерирует я без понятия... И шарписты разработчики ничего сказать не могут...
на тему заменить дроп-креат на альтер - ну да... первая мысль в этом и была... один фиг блокировка Sch-М будет... не понимаю поможет это в ситуации или нет. Единственно что можно "попробовать" вдруг прокатит

И еще... в чем может быть невидимый подвох
+ вьюха
IF OBJECT_ID ('AllTasks', 'V') IS NOT NULL
	DROP VIEW [dbo].[AllTasks]
GO

CREATE VIEW [dbo].[AllTasks] WITH SCHEMABINDING
AS
(
	SELECT
		t.Id 'Id',
		t.AvatarId 'AvatarId',
		t.CreatorId 'CreatorId',
		ISNULL(tp.Amount, 0) 'Amount',
		tp.PriceRangeId,
		tp.FeeFree,
		t.CategoryCode 'Category',
		t.SubcategoryId,
		t.DateNeedBegin 'DateNeedBegin',
		t.DateNeedEnd 'DateNeedEnd',
		t.StateCode 'State',
		t.DateAttached,
		t.IsPrivate,
		t.City,
		t.OffersCount,
		t.Name,
		t.RegularState
		FROM
			dbo.Task t
			INNER JOIN dbo.TaskPrice tp ON tp.TaskId = t.Id
		WHERE 
			CategoryCode != 4096 --конкурсы
			AND IsOuter = 0 --не яндекс заявки
				
)
go

вьюха со SCHEMABINDING - это старый рудимент, который можно смело выпилить. Возможно это дополнение накладывает блокировки для дидлока?...
9 дек 16, 11:16    [19983713]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Дед-Папыхтет,

SCHEMABINDING не даст выдёргивать колонки из таблицы, вас же ничего не спасёт :)
9 дек 16, 11:23    [19983756]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
TaPaK
Дед-Папыхтет,

SCHEMABINDING не даст выдёргивать колонки из таблицы, вас же ничего не спасёт :)

Это понятно )))))). Никто колонки и не выдергивает
9 дек 16, 11:28    [19983788]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Дед-Папыхтет,

дык.
9 дек 16, 11:29    [19983797]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Владислав Колосов,

Ок.... попробую:
1. руками изменить вьюху на прод без привязки к сехеме.
2. накатить текущие миграции - да в этой миграции снова вьюха станет schemabinding.
3. снова удалить на прод schemabinding.
4. в новой миграции уже добавить эту вьюху без schemabinding....

полагаю если проблема именно в привязке к схеме - все должно пройти и без откатывания миграции текущей не прошедшей...
9 дек 16, 11:36    [19983847]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
Дед-Папыхтет
вьюха со SCHEMABINDING - это старый рудимент, который можно смело выпилить. Возможно это дополнение накладывает блокировки для дидлока?...
Ответы нужно читать и пытаться их понять, а не тыкать пальцем в небо.
9 дек 16, 11:37    [19983853]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
invm
Дед-Папыхтет
вьюха со SCHEMABINDING - это старый рудимент, который можно смело выпилить. Возможно это дополнение накладывает блокировки для дидлока?...
Ответы нужно читать и пытаться их понять, а не тыкать пальцем в небо.

ок - резюмируй что я не прочитал?
9 дек 16, 11:38    [19983858]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
Дед-Папыхтет
что я не прочитал?
19983655
9 дек 16, 11:46    [19983935]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Дед-Папыхтет,


1. Выяснить, нахрена вообще менять вьюху
2. Вьюху менять через ALTER VIEW в отдельной транзакции.
3. После ALTER вызвать sp_refreshview
4. SCHEMABINDING не при чем, он запрещает некоторые изменения на базовых таблицах, но никак не препятствует менять саму вьюху
9 дек 16, 11:49    [19983955]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
o-o
Guest
Дед-Папыхтет
invm
пропущено...
Ответы нужно читать и пытаться их понять, а не тыкать пальцем в небо.

ок - резюмируй что я не прочитал?

то и не прочел, что разный порядок доступа к таблицам.
читатель только читает, он не хочет никакое Sch-M ни на что.
у него уже есть Sch-S on dbo.AllTasks,
а хочет он Sch-S on dbo.VerifiedUsersData.

изменятель же имеет Sch-M on dbo.VerifiedUsersData,
хочет Sch-M on dbo.AllTasks.

в одной транзакции модифицируете, так что YOUDO\akordubaylo не отпустит первое Sch-M on dbo.VerifiedUsersData,
пока второе (Sch-M on dbo.AllTasks) не получит и транзакцию не завершит
invm
1. Ваша "миграция" делается в транзакции.
2. При read uncommitted на объекты накладывается Sch-S

Порядок наложения Sch-M на объекты в "миграции" не совпадает с порядком наложения Sch-S на объекты в запросе. Отсюда и дедлок.

Способ лечения - отказаться от read uncommitted и включить RCSI.

а вы с Гавриленко считает, что это читатель хочет Sch-M,
а читaтель просто накладывает Sch-S в обратном порядке, чем изменяющая транзакция,
не надо гнать на шарпистов, которые типа Sch-M накладывают.
все Sch-M -- ваши, owner, waiter = YOUDO\akordubaylo

дубайло, как я понимаю, это вы (a YOUDO\daemon = reader)
9 дек 16, 11:53    [19983978]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8494
Схемабиндинг может требоваться для индексирования. Надо всесторонне изучить. Либо это миссион критикал вьюха.
9 дек 16, 12:04    [19984035]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Владислав Колосов
Схемабиндинг может требоваться для индексирования. Надо всесторонне изучить. Либо это миссион критикал вьюха.

для индексированных это обязательно, "миссион критикал" которую они постоянно дропают :) и не накладывает ничего SCHEMABINDING
9 дек 16, 12:08    [19984056]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
o-o
Дед-Папыхтет
пропущено...

ок - резюмируй что я не прочитал?

то и не прочел, что разный порядок доступа к таблицам.
читатель только читает, он не хочет никакое Sch-M ни на что.
у него уже есть Sch-S on dbo.AllTasks,
а хочет он Sch-S on dbo.VerifiedUsersData.

изменятель же имеет Sch-M on dbo.VerifiedUsersData,
хочет Sch-M on dbo.AllTasks.

в одной транзакции модифицируете, так что YOUDO\akordubaylo не отпустит первое Sch-M on dbo.VerifiedUsersData,
пока второе (Sch-M on dbo.AllTasks) не получит и транзакцию не завершит
invm
1. Ваша "миграция" делается в транзакции.
2. При read uncommitted на объекты накладывается Sch-S

Порядок наложения Sch-M на объекты в "миграции" не совпадает с порядком наложения Sch-S на объекты в запросе. Отсюда и дедлок.

Способ лечения - отказаться от read uncommitted и включить RCSI.

а вы с Гавриленко считает, что это читатель хочет Sch-M,
а читaтель просто накладывает Sch-S в обратном порядке, чем изменяющая транзакция,
не надо гнать на шарпистов, которые типа Sch-M накладывают.
все Sch-M -- ваши, owner, waiter = YOUDO\akordubaylo

дубайло, как я понимаю, это вы (a YOUDO\daemon = reader)

Изменятель полагаю не имеет Sch-M на dbo.VerifiedUsersData
[qout например воспроизводим]
CREATE TABLE dbo.T1(col1 int NOT NULL PRIMARY KEY)
GO
CREATE TABLE dbo.T2(col1 int NOT NULL PRIMARY KEY)
GO
 
CREATE VIEW dbo.V1 WITH SCHEMABINDING AS SELECT col1 FROM dbo.T1
GO
CREATE VIEW dbo.V2 AS SELECT col1 FROM dbo.T2
GO

BEGIN TRAN
if object_id('dbo.V1') is not null
    DROP VIEW dbo.V1
go
SELECT OBJECT_NAME(resource_associated_entity_id), request_mode FROM sys.dm_tran_locks l WHERE request_session_id = @@spid AND resource_type = 'OBJECT' AND resource_associated_entity_id in (OBJECT_ID('dbo.T1'),object_id('dbo.V1'),object_id('dbo.V2'))
go
if object_id('dbo.V2') is not null
    DROP VIEW dbo.V2
go
SELECT OBJECT_NAME(resource_associated_entity_id), request_mode FROM sys.dm_tran_locks l WHERE request_session_id = @@spid AND resource_type = 'OBJECT' AND resource_associated_entity_id in (OBJECT_ID('dbo.T1'),object_id('dbo.V1'),object_id('dbo.V2'))
go
CREATE VIEW dbo.V1 WITH SCHEMABINDING AS SELECT col1 FROM dbo.T1
go
SELECT OBJECT_NAME(resource_associated_entity_id), request_mode FROM sys.dm_tran_locks l WHERE request_session_id = @@spid AND resource_type = 'OBJECT' AND resource_associated_entity_id in (OBJECT_ID('dbo.T1'),object_id('dbo.V1'),object_id('dbo.V2'))
go
CREATE VIEW dbo.V2 AS SELECT col1 FROM dbo.T2
GO
SELECT OBJECT_NAME(resource_associated_entity_id), request_mode FROM sys.dm_tran_locks l WHERE request_session_id = @@spid AND resource_type = 'OBJECT' AND resource_associated_entity_id in (OBJECT_ID('dbo.T1'),object_id('dbo.V1'),object_id('dbo.V2'))
go
COMMIT
GO
[/spoiler]
Здесь не видно Sch-M на таблицы у изменятеля
9 дек 16, 12:15    [19984119]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
TaPaK
Владислав Колосов
Схемабиндинг может требоваться для индексирования. Надо всесторонне изучить. Либо это миссион критикал вьюха.

для индексированных это обязательно, "миссион критикал" которую они постоянно дропают :) и не накладывает ничего SCHEMABINDING

была когда то эта вьюха индексирвоанная, гемора больше чем пользы в итоге отказались так же давно, предложение SCHEMABINDING не выпилили - рудимент
9 дек 16, 12:16    [19984128]     Ответить | Цитировать Сообщить модератору
 Re: Что сделать, что бы избежать deadlock?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
invm
Дед-Папыхтет,

1. Ваша "миграция" делается в транзакции.
2. При read uncommitted на объекты накладывается Sch-S

Порядок наложения Sch-M на объекты в "миграции" не совпадает с порядком наложения Sch-S на объекты в запросе. Отсюда и дедлок.

Способ лечения - отказаться от read uncommitted и включить RCSI.

Да в транзакции, причем видно в графе XML что там trancount=2.
риданкомитед убирать не вариант... или на снапшот уровень изоляции менять, что может полагаю добавить дидлоков. Или тормоза при блокировках добавятся...
9 дек 16, 12:18    [19984141]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить