Блокировка стола при вставке - PullRequest
8 голосов
/ 23 марта 2012

У меня есть большая таблица, которая заполняется из вида. Это сделано потому, что представление занимает много времени и легче иметь данные, легко доступные в таблице. Процедура запускается так часто, что обновляет таблицу.

 TRUNCATE TABLE LargeTable

 INSERT INTO LargeTable
 SELECT * 
 FROM viewLargeView
 WITH (HOLDLOCK)

Я бы хотел заблокировать эту таблицу при вставке, чтобы, если кто-то попытается выбрать запись, он не получит ни одной после усечения. Блокировка, которую я использую, кажется, блокирует представление, а не таблицу.

Есть ли лучший способ решить эту проблему?

Ответы [ 2 ]

6 голосов
/ 23 марта 2012
BEGIN TRY
 BEGIN TRANSACTION t_Transaction

 TRUNCATE TABLE LargeTable

 INSERT INTO LargeTable
 SELECT * 
 FROM viewLargeView
  WITH (HOLDLOCK)

 COMMIT TRANSACTION t_Transaction
END TRY 
BEGIN CATCH
  ROLLBACK TRANSACTION t_Transaction
END CATCH
5 голосов
/ 23 марта 2012

Это правда, что ваша правильная подсказка блокировки влияет на исходный вид.

Чтобы сделать так, чтобы никто не мог читать из таблицы, пока вы вставляете:

insert into LargeTable with (tablockx)
...

Вы нене нужно ничего делать, чтобы таблица выглядела пустой до завершения вставки.Вставка всегда выполняется в транзакции, и никакой другой процесс не может прочитать незафиксированные строки, если они явно не указывают with (nolock) или set transaction isolation level read uncommitted.Насколько я знаю, от этого нет способа защититься.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...