2016-02-04 4 views
0

У меня есть таблица с столбцом с именем Time типа datetime2.Блокировка при вставке в SQL Server Express 2014

Мне нужно запустить весь этот запрос, если никто не читает или не изменяет данные в таблице при его выполнении.

IF NOT EXISTS (SELECT Id FROM Bookings WHERE Time >= '2016-02-02 09:00:00' AND Time < '2016-02-02 11:00:00') BEGIN -- Insert some data END

Запрос находится внутри транзакции в приложении ASP.NET, но я не уверен, что это достаточно. Нужно ли мне применять подсказки блокировки или установить уровень изоляции? Если да, то как мне это сделать?

Я читал о TABLOCK, и, похоже, он делает то, что я хочу, но это излишнее? И где бы я указал, что TABLOCK требуется для всего запроса, а не только для оператора select?

ответ

0

Таким образом, вы не хотите, чтобы какая-либо другая транзакция вставляла строки, имеющие значение времени между '2016-02-02 09:00:00' и '2016-02-02 11:00:00'. Вы не должны использовать TABLOCK, так как это приведет к совместному блокированию всей таблицы. Это не позволит вставлять, обновлять и удалять из другой транзакции. Вы просто хотите заблокировать временной диапазон. используйте табличную подсказку - Holdlock в вашем выписке -

IF NOT EXISTS (SELECT Id FROM Bookings with (holdlock) 
    WHERE Time >= '2016-02-02 09:00:00' AND Time < '2016-02-02 11:00:00') 
     BEGIN 
     -- Insert some data 
     END 
Смежные вопросы