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

Откуда:
Сообщений: 106
Существует некая таблица с данными (T1) > 10млн

Хотелось бы в нее вставлять данные и апдейтить данные в ней без блокировок на чтение (X (Exclusive) ) и на запись(!)

Происходит данная операция двумя способами

1. У нас есть буферная таблица Т2, в нее мы заносим данные из внешнего источника данных.
Далее происходит вот так

set transaction isolation level snapshot;
begin tran

delete from T1 where ServerId = 1;

insert into T1 select * from T2;

delete from T2 where ServerId = 1;

commit

Так как данных в таблице Т2 очень много, то эта операция продолжается 2-3 минуты
В результате чего доступ к таблице Т1 блокируется (на запись) я понимаю что тут может появиться некая коллизия, но всеже, как можно это решить?
На чтение таблица доступна.

2. Мы производим в таблице Т1 множество апдейтов (после их вставки из пункта 1)

set transaction isolation level snapshot;
begin tran

update T1 set F1 = F2+F3 where ServerId = 1; -- для примера, таких апдейтов много

commit

В результате мы имеем блокировку на запись. Таже ситуация что и в пунке 1.

В syslockinfo видно что таблица в режиме - X (Exclusive)
А отдельный запрос на запись в режиме - IX (Intent Exclusive), status - Waiting

-------

Так вот, как вообще такое дело можно организовать без блокировок и возможно ли такое впринципе?
Т.е. Нужно решить проблему множества вставок и апдейтов из различных источников данных.

ЗЫ. Прошу помидорами не бросать, я не SQL'щик :)
28 июн 11, 11:32    [10885509]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с блокировками в snapshot при вставке и апдейте  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А индексы то хоть какие-нибудь есть?
28 июн 11, 11:36    [10885544]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с блокировками в snapshot при вставке и апдейте  [new]
truper
Member

Откуда:
Сообщений: 106
Пока индексов нет, идет процесс разработки.
28 июн 11, 11:57    [10885676]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с блокировками в snapshot при вставке и апдейте  [new]
truper
Member

Откуда:
Сообщений: 106
Ну кроме кластерного PK на ID

Почитал я насчет индексов, они якобы должны помочь блокировать не всю таблицу а отдельные записи, вот только как в моем 1ом случае это поможет когда я вначале удаляю ВСЕ записи по условию ServerId = 1 а потом вставляю их
И в этот момент пытаюсь вставить запись с полем ServerId = 1
28 июн 11, 12:42    [10885964]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с блокировками в snapshot при вставке и апдейте  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
truper
Пока индексов нет, идет процесс разработки.
Ну, дык, у вас же при каждой операции идет полное сканирование таблицы. Чего тогда удивляться?..
28 июн 11, 12:43    [10885965]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с блокировками в snapshot при вставке и апдейте  [new]
truper
Member

Откуда:
Сообщений: 106
Вы все верно сказали насчет индексов, но
нужно иметь ввиду что у меня записи удаляются в самом начале по ключу ServerId = 1 (это очень большой ключ который охватывает большое число данных), соотвественно вставить новую запись с таким ключем уже невозжно, стоит лок.

Проблема решилась при помощи merge
т.е. тем самым мы не лочим целый блок таблицы, а обновляем только те данные которые (по условию) могут обновиться и вставляем только те данные которых нет в таблице T1.
По сути merge в данном случае идеальное решение.
28 июн 11, 16:02    [10887625]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить