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

Откуда:
Сообщений: 91
У меня 14 Заданий в SQL сервер, которые загружают прайсы поставщиков.
Все через OLE DB, все грузят прайсы в одну таблицу. Проблема в том, что когда они все разом запускаются (расписание у них проверка своих папок каждые 20 мин), то начинают конфликтовать друг с другом.
SQL-SERVER
Сообщение 1205, степень серьезности 13, состояние 45, строка 1: Транзакция (идентификатор процесса 161) вызвала взаимоблокировку ресурсов блокировка | буфер связи с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно. [SQLSTATE 40001]

Что можно сделать чтоб этого избежать?
29 сен 15, 17:18    [18210868]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Glory
Member

Откуда:
Сообщений: 104760
TimonSX
Что можно сделать чтоб этого избежать?

Запросы переписать
29 сен 15, 17:19    [18210872]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
А помогите пожалуйста, что тут надо добавить/изменить?

Update [dbo].[Price]
set [MinOrder]= 0
from [dbo].[Price]  
where [_IDBrand]='289753bb-7ea4-11e4-9abf-a0d3c1197a54' and [MinOrder]<> 0
go

declare @TabStockAUDI Table(CatName nvarchar(50), MinOrder numeric(18,2))

INSERT INTO @TabStockAUDI (MinOrder,CatName)
Select
a.[Spec# pack# unity],
a.Material
from  OpenrowSet(
'Microsoft.ACE.OLEDB.12.0',
'excel 12.0 xml;Database=\\pdc.rsm.local\Share\VendorsPrice\WORK\AUDI1.xlsx',
'SELECT * FROM A:Z') as a

Update [dbo].[Price]
set price.MinOrder = ISNULL(tab.MinOrder,0)
, [DateLoad] = getdate()
from [dbo].[Price] as price left Join @TabStockAUDI as tab
on price.CatName=tab.CatName and price.[_IDBrand]='289753bb-7ea4-11e4-9abf-a0d3c1197a54'
go
29 сен 15, 17:26    [18210934]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Glory
Member

Откуда:
Сообщений: 104760
TimonSX
А помогите пожалуйста, что тут надо добавить/изменить?

Тут нужно
- получить граф взаимоблокировки
- изучить его
- пеерписать те запросы, на которые указывает граф. а не те, что вам нравяться
29 сен 15, 17:28    [18210953]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
TimonSX,

Уберите первый update, его присутствие бессмысленно учитывая left join в последнем.
Хотя на дедлоки это не повлияет так как это разные батчи, если у вас все 14 заданий с одинаковым кодом, то Глори прав нужен граф, так как в этом коде нет состава преступления.
Да и сктруктуру [dbo].[Price] покажите.
29 сен 15, 17:58    [18211236]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
Блокируются постоянно разные задания. Вот пример графов последнего.
Там OPEL и CHEVROLET это задания, которые заблокировались.
DBOPRICE это таблица.
1,2,3 - это три графа которые показал Профайлер.

У меня впечатление что это блокировки по OLE DB. Когда несколько заданий пытаются к нему одновременно подключится.
Как это обойти то?

К сообщению приложен файл (GRAF.rar - 9Kb) cкачать
29 сен 15, 18:39    [18211488]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
так же регулярно появляется блокировка по этому запросу:
DELETE FROM [dbo].[Price]
      WHERE _IDBrand = 'ab3da11e-301a-4da6-8e21-413d50734b86'
GO

Когда несколько заданий пытаются очистить старые прайсы. (IDBrand у всех разный)
29 сен 15, 19:46    [18211708]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Okmor
Member

Откуда:
Сообщений: 132
Попробуйте merge и на одну транзакцию будет меньше.
29 сен 15, 19:58    [18211742]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
После merge все равно надо будет удалять то что не обновилось, транзакций столько же, а merge пом более тяжелая операция чем инсерт
29 сен 15, 20:00    [18211751]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
Ну короче индексами вроде починил, пока бокировок нет
29 сен 15, 21:48    [18212133]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Glory
Member

Откуда:
Сообщений: 104760
TimonSX
Ну короче индексами вроде починил, пока бокировок нет

Взаимоблокировка происходила на непоказанной вами команде

Insert into [dbo].[PriceGroup] (GroupDescription)
Select distinct
a.Groupe_1
from @TempTableOPEL as a
Left join [dbo].[PriceGroup] as PriceGroup on (a.Groupe_1 = PriceGroup.GroupDescription)
where PriceGroup._IDPriceGroup is null
30 сен 15, 08:22    [18212722]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
TimonSX
Member

Откуда:
Сообщений: 91
Glory, в архиве с блокировками там два задания, вот там этот запрос и есть.
30 сен 15, 10:54    [18213338]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Glory
Member

Откуда:
Сообщений: 104760
TimonSX
в архиве с блокировками там два задания, вот там этот запрос и есть.

У вас все взаимоблокировки вокруг одной таблицы - PriceGroup
30 сен 15, 11:00    [18213386]     Ответить | Цитировать Сообщить модератору
 Re: Как убрать взаимоблокировку заданий?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
TimonSX,

загружайте данные во временные таблицы из внешних источников и по заданию последовательно загружайте эти данные в основные.
30 сен 15, 12:54    [18214275]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить