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

Откуда: Саратов
Сообщений: 467
Как правильно разрешить взаимоблокировки, возникающие при параллельном выполнении команд вида
Команда 1
begin tran
delete from tbOrders
where id =7

--break point
select SUM(cost)
from tbOrders
where id<11
...
commit tran


Команда 2
begin tran
delete from tbOrders
where id =3

--break point
select SUM(cost)
from tbOrders
where id<11
...
commit tran

То есть по большому счету мне нужно, чтобы команда, стартовавшая первой блокировала необходимые ей ресурсы.
В противном случае при одновременном подходе к break point возникает dead lock.
20 фев 13, 17:26    [13956432]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
if @@trancount > 0
    rollback
    
begin tran
declare 
    @a int
    
select @a = SUM(cost)
from tbOrders with ( xlock )
where id<11

    
delete from tbOrders
where id =3

waitfor delay '00:00:10'
--break point
select SUM(cost)
from tbOrders
where id<11

rollback
20 фев 13, 17:37    [13956520]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Crimean
Member

Откуда:
Сообщений: 13148
RCSI, если вас устроит результат
дедлока точно не будет
20 фев 13, 17:37    [13956525]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Crimean,
вы имели в виду
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
?

Мне больше подходит другой вариант:
begin tran

delete from tbOrders 
with (xlock, tablock)
where id = 3

select SUM(cost)
from tbOrders
where id<11
commit tran

Здесь команда, стартовавшая первой, блокирует всю таблицу tbOrders до завершения транзакции.
Поправьте, если я ошибаюсь.
20 фев 13, 18:34    [13956894]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Шамиль Фаридович
В противном случае при одновременном подходе к break point возникает dead lock.

Т.е. для 2х delete ? Это вы в графе увидели ? Вместе с описанием спорных ресурсов ?
20 фев 13, 18:36    [13956905]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Шамиль Фаридович
Crimean,
вы имели в виду
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
?

RCSI — это Read Committed Snapshot Isolation. Устанавливается на базе командой "ALTER DATABASE <имя> SET READ_COMMITTED_SNAPSHOT ON".

Шамиль Фаридович
Мне больше подходит другой вариант:
begin tran

delete from tbOrders 
with (xlock, tablock)
where id = 3

select SUM(cost)
from tbOrders
where id<11
commit tran

Здесь команда, стартовавшая первой, блокирует всю таблицу tbOrders до завершения транзакции.
Поправьте, если я ошибаюсь.

Если вас устроит паровоз из блокировок на tbOrders — то да, это вариант решения вашей проблемы. Правда, это решение совершенно немасштабируемо.
20 фев 13, 18:40    [13956919]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Glory
Т.е. для 2х delete ? Это вы в графе увидели ? Вместе с описанием спорных ресурсов ?

Скорее после них, когда select'ы пытаются обратится к взаимоблокируемым данным. Это я увидел в режиме отладки.
20 фев 13, 18:47    [13956939]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Шамиль Фаридович
Это я увидел в режиме отладки.

Покажите лучше граф взаимоблокировки.
20 фев 13, 18:48    [13956951]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Crimean
Member

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

там ошибка в формулировке
конечно же не на подходе к указанной "бректочке", а после того, как в обоих кверях после delete запустить select sum
описанным способом приведенный пример для read committed прекрасно дедлочит - я пробовал
ну и, разумеется, все прекрасно отрабатывает в RCSI, только вот устроит ли такое поведение ТС - вопрос
20 фев 13, 20:51    [13957417]     Ответить | Цитировать Сообщить модератору
 Re: Взаимоблокировка  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Glory, граф во вложении.

К сообщению приложен файл (Deadlock.xdl - 7Kb) cкачать
21 фев 13, 12:04    [13959887]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить