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

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

Получил на базе deadlock и не могу его засимулировать, с левой стороны одни блокировки (S). Когда идут последовательно (U) и (S) понятно:

Сессия 1
BEGIN TRAN

SELECT poi.*
  FROM dbo.pos_order_item poi
  WHERE poi.pos_order_item_id = '1:9311'
ORDER BY poi.modified_date ASC;

SELECT poi.*
  FROM dbo.pos_order_item poi
  WHERE poi.pos_order_item_id = '1:9312'
ORDER BY poi.modified_date ASC;

COMMIT TRAN


Сессия 2
BEGIN TRAN

UPDATE dbo.pos_order_item
  SET block_stock_doc = 1
WHERE pos_order_item_id = '1:9312';

UPDATE dbo.pos_order_item
  SET block_stock_doc = 1
WHERE pos_order_item_id = '1:9311';

COMMIT TRAN


Помогите засимулировать блокировку как скрине.

К сообщению приложен файл. Размер - 26Kb
21 авг 17, 15:56    [20739207]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36973
Уровень изоляции транзакции с селектами поднимите, и получите свой дедлок.
21 авг 17, 16:06    [20739256]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
mezzanine,

(UPDLOCK) какой нить на SELECT
21 авг 17, 16:07    [20739262]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ой вруууу :)
21 авг 17, 16:14    [20739295]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
mezzanine
Member

Откуда:
Сообщений: 157
В отчете каждый процесс имеет isolationlevel="read committed (2)"

К сообщению приложен файл (report1.xml - 6Kb) cкачать
21 авг 17, 16:21    [20739320]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36973
Паглоки и неуникальный индекс/скан индекса? В этом случае при read committed сервер не отпускает предыдущий лок, не наложив следующий, создавая предпосылки для дедлоков. Rowlock или rcsi спасут.
21 авг 17, 16:30    [20739357]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
Выполнение транзакций нужно либо синхронизировать по времени, либо выполнять в бесконечном цикле, либо выполнять пошагово.
Для гарантии наложения S на страницу, да еще чтобы не снялась после выполнения инструкции нужно
FROM dbo.pos_order_item poi with (paglock, repeatableread)
21 авг 17, 16:35    [20739382]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
для теста можно и tablock что бы не мучался. А так когда попадёт в одну страницу
21 авг 17, 16:42    [20739421]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Гавриленко Сергей Алексеевич,

В запросах не используются with (...). Правильно я понял что "select" с условием "where" без поля с уникальным индексем может дать блокировки страницы. И допустм такие запросы в цикле могут привести к deadlock.
21 авг 17, 18:27    [20739741]     Ответить | Цитировать Сообщить модератору
 Re: Deadlock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36973
mezzanine
В запросах не используются with (...). Правильно я понял что "select" с условием "where" без поля с уникальным индексем может дать блокировки страницы. И допустм такие запросы в цикле могут привести к deadlock.
Перебор листового уровня с paglock (который сервер успешно у вас выбирает и без with) приводит к тому, что при выборке блокируется подряд две страницы листового уровня. Соответственно, если ваш update меняет записи и блокирует страницы в обратном порядке, то возникает самый классический на свете дедлок.
21 авг 17, 19:03    [20739799]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить