Явная блокировка таблиц в SQL Server? - PullRequest
2 голосов
/ 03 марта 2011

Можно ли сделать явную общую блокировку для таблицы в SQL Server?

Мне нужно сделать следующее:

  • таблица общих блокировок
  • копировать таблицу во временную таблицу, для манипуляций
  • стол с эксклюзивным замком
  • копировать материал из таблицы в таблицу
  • снять все блокировки

По сути, я хочу быть уверен, что в таблицу ничего не добавлено, пока я делаю что-то для временной таблицы, но я все еще хочу, чтобы она была читабельной.

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

1 Ответ

3 голосов
/ 03 марта 2011

Единственный способ удержать блокировку таблицы - оставить транзакцию открытой.Поэтому нам может понадобиться больше информации об этой «тупиковой ситуации в некоторых вещах, которые я делаю с временной таблицей».

В зависимости от задачи временная таблица может вообще не понадобиться - похоже, выПостроение чего-либо из процедурного мышления, а не основанного на множестве.

Базовым эскизом того, что вы обрисовали в общих чертах, будет:

/* Create temp table here */
BEGIN TRANSACTION
INSERT INTO #Table (/* Columns */)
SELECT /* Columns */ FROM SourceTable WITH (UPDLOCK,HOLDLOCK)

/* Work within temp table here */
UPDATE st
SET
   /* Set new column values based on temp table */
FROM
   SourceTable st
       inner join
   #Table t
       on
           /* Key column join here */
COMMIT

Вам нужно указать блокировку UPDATE, а неразделяемая блокировка, которая фактически является «разделяемой блокировкой сейчас, но я собираюсь перейти к исключительной позже в рамках той же транзакции», чтобы предотвратить возможную тупиковую ситуацию.

...