Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Deadlock при запросе на выборку в программе без явных блокировок


И. Павел ©   (2011-08-25 15:36:00) 

Здравствуйте.

В программе не пользуюсь блокировками (кроме тех, которые возникают автоматически). Тем более никогда не делал блокировки на чтение таблицы со списком пользователей.
Но при этом в программе несколько раз возникла ошибка:
Transaction (Process ID 193) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.

Эта ошибка возникает при запросах вида:
SELECT id, ItemID, SysNum, IsNew FROM USERLIST.dbo.MonMes WHERE MesType = 5 AND IDMonUsers = 472 ORDER BY ItemID ASC

Таблица MonMes используется очень часто. В нее постоянно что-то пишется или обновляются какие-нибудь записи. Подскажите, пожалуйста, может ли этот deadlock быть следствием стандартных блокировок при INSERT/UPDATE? Или все же что-то поставило блокировку на чтение на талицу MonMes?

PS: СУБД - MS SQL SERVER 2005.


И. Павел   (2011-08-25 16:55:00) [1]

Все, кажется разобрался.
Во время UPDATE при изменении данных возникает "lock conversion to an exclusive (X) lock".
А Exclusive может блокировать даже попытки чтения:
Exclusive (X) locks prevent access to a resource by concurrent transactions. No other transactions can read or modify data locked with an exclusive (X) lock.

Видимо, SELECT пришелся на UPDATE и из-за того, что UPDATE возникают почти без остановки, не смог через них пробиться.


И. Павел   (2011-08-25 16:50:00) [2]

> А разве в скуле select без nolock не блокирует записи?

Во время SELECT используется блокировка типа Shared. Но "Shared (S) locks allow concurrent transactions to read (SELECT) a resource". Поэтому пара SELECT должна выполняться не мешая друг другу.


Sergey13   (2011-08-25 16:36:00) [3]

> [2] И. Павел ©   (25.08.11 16:26)

А разве в скуле select без nolock не блокирует записи?


И. Павел   (2011-08-25 16:26:00) [4]

> [1] Вариант   (25.08.11 15:40)

Ясно. Спасибо. Стараюсь не использовать явных блокировок в программах, но они, похоже, и не нуждаются в приглашении :)


Вариант   (2011-08-25 15:40:00) [5]

Может


Наверх

Титульная страница Поиск, карта сайта Написать письмо