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

Откуда: Минск
Сообщений: 17
Здравствуйте. Нужно избежать deadlock'a.

У меня есть договоры, которым нужно присваивать разные номера. Так вот, я храню максимальный номер договора в таблице, а потом при создании нового договора, лезу в эту таблицу за уже имеющимся максимальным номером, приплюсовываю к нему единицу и присваиваю этот номер моему договору. Этот же номер я сохраняю как максимальный. и.т.д. При создании нового договора все повторяется.

Реализовано это у меня вот примерно так:

Таблица T_max_doc_number c полями id_mfo int (PK) и max_doc_number int - хранит максимальный номер договора.

Вот моя транзакция, которая выполняется внутри хранимой процедуры. Тут возникает deadlock.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION
   declare @max_doc_number int
            
   select @max_doc_number = max_doc_number from t_max_doc_number where id_mfo = 2
           
   set @max_doc_number = @max_doc_number + 1
            
    update t_max_doc_number
    set max_doc_number = @max_doc_number
    where id_mfo = 2
	   
COMMIT TRANSACTION 

Я в принципе не понимаю, почему здесь возникает deadlock (а он возникает) и как от него избавиться.

Помогите разобраться, плиз.
15 дек 09, 14:09    [8069062]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @max_doc_number int
update t_max_doc_number
set @max_doc_number = max_doc_number = max_doc_number+1
where id_mfo = 2
15 дек 09, 14:12    [8069077]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Не помогает.
15 дек 09, 14:32    [8069277]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
Glory
Member

Откуда:
Сообщений: 104760
ne_delfist
Не помогает.

Тогда предоставьте граф дедлока
15 дек 09, 14:33    [8069290]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
А как это сделать?
15 дек 09, 14:43    [8069389]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Под словами "граф дедлока" понимался execution plan (я работаю в visualStudio)?
15 дек 09, 14:56    [8069518]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
Glory
Member

Откуда:
Сообщений: 104760
ne_delfist
Под словами "граф дедлока" понимался execution plan (я работаю в visualStudio)?

Нет

BOL - Detecting and Ending Deadlocks
15 дек 09, 14:58    [8069534]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
vino
Member

Откуда:
Сообщений: 1191
ne_delfist

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION
   declare @max_doc_number int
            
   select @max_doc_number = max_doc_number from t_max_doc_number where id_mfo = 2
           
   set @max_doc_number = @max_doc_number + 1
            
    update t_max_doc_number
    set max_doc_number = @max_doc_number
    where id_mfo = 2
	   
COMMIT TRANSACTION 

Я в принципе не понимаю, почему здесь возникает deadlock (а он возникает) и как от него избавиться.

Помогите разобраться, плиз.
Надо бы почитать сначала, например, в поиске по вашему вопросу Покритикуйте счетчик....
15 дек 09, 15:38    [8069831]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Боюсь, что я зависла, с графом дедлоков. Без него никак?
15 дек 09, 15:40    [8069850]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Добавила в селект - WITH (HOLDLOCK TABLOCK) - дедлок остался.
15 дек 09, 15:53    [8069982]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
vino
Member

Откуда:
Сообщений: 1191
ne_delfist, раз не помогает, значит, в другом месте возникает, так что без графа вряд ли получится
15 дек 09, 15:58    [8070056]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
vino
Member

Откуда:
Сообщений: 1191
А чем не устраивает вариант
Glory
declare @max_doc_number int
update t_max_doc_number
set @max_doc_number = max_doc_number = max_doc_number+1
where id_mfo = 2
если, конечно версия сервера позволяет
15 дек 09, 16:00    [8070066]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
ne_delfist
Боюсь, что я зависла, с графом дедлоков. Без него никак?
Почему зависли?
Вот, статью посмотрите.
https://www.sql.ru/articles/mssql/2007/011005DeadlockTroubleshootingPart1.shtml
Без графа сложно...
15 дек 09, 16:00    [8070068]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Vino, спасибо Вам. Внимательно перечитала статью про счетчик, действительно моя проблема вроде бы решается с помощью предложенного варианта.
15 дек 09, 16:16    [8070202]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать Deadlock?  [new]
ne_delfist
Member

Откуда: Минск
Сообщений: 17
Ой, похоже благодарить надо Glory. Спасибо. Я невнимательно прочитала Ваш совет в начале, но ничего, пошло на пользу, почитала интересную дискуссию про "счетчик".
15 дек 09, 16:27    [8070303]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить