Вы сказали:
Я не хочу мешать другим
процессы от чтения таблицы, но
Я хочу предотвратить другие процессы
обновление таблицы.
Вам просто нужна общая блокировка чтения на время TXN. Это означает, что никакой другой процесс не может получить блокировку «записи» в сочетании с TABLOCK. И вам тоже не нужен COUNT.
...
BEGIN TRANSANCTION
SELECT TOP 1 KeyCol FROM TheTable WITH (TABLOCK, HOLDLOCK)
...
Почему вы думаете, что хотите ОБНОВИТЬ БЛОКИРОВКУ?
HOLDLOCK или SERIALIZABLE
Эквивалентно SERIALIZABLE. Для большего
информация, см. SERIALIZABLE позже в
Эта тема. HOLDLOCK применяется только к
таблица или представление, для которого это
указано и только на срок
транзакция, определенная
утверждение, что оно используется в.
...
Делает общие блокировки более строгими
удерживая их, пока транзакция
завершено, вместо того, чтобы выпустить
общая блокировка, как только требуется
таблица или страница данных больше не
необходимо, имеет ли транзакция
было завершено или нет.
Редактировать после комментария:
- «эксклюзивная блокировка» означает «только один процесс, использующий данные».
- «SERIALIZABLE» в основном означает удерживать блокировки (общие, эксклюзивные, что угодно) намного дольше.
Нельзя указать "эксклюзивную блокировку" и , чтобы другие процессы могли читать. Концепции являются взаимоисключающими. Вы хотите предотвратить запись во всю таблицу, что будет делать persisted shared / read lock. Вот тут и начинается SERIALIZABLE.
С "Режимы блокировки"
Общие замки
... других нет
транзакции могут изменить данные, в то время как
общие (S) блокировки существуют на
ресурс. Общие (S) замки на
ресурс выпущен, как только
операция чтения завершается, если только
уровень изоляции транзакции установлен на
повторяемое чтение или выше, или
подсказка блокировки используется для сохранения
общие (S) блокировки на время
сделка.
Итак: общая блокировка запрещает запись и может быть сохранена, сделав ее SERIALIZABLE