Блокировка только для чтения в SQL Server - PullRequest
3 голосов
/ 13 декабря 2010

Мне кажется, что в SQL Server 2008 отсутствует что-то, что блокируется. Это мой сценарий:

  1. Начало передачи.
  2. Чтение из таблицы A, чтобы убедиться, что определенная строка найдена.
  3. Во время чтения установите блокировку только для чтения на чтение одной строки.Если не найдено, выведите ошибку.
  4. Вставьте в таблицу B, которая включает ссылку на таблицу A.
  5. Зафиксируйте tran (сняв блокировку).

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

Я не хочу использовать XLOCK или UPDLOCK таблицу A, поскольку транзакция, в которой я сейчас нахожусь, только читает из нее, а не пишет.Однако, очевидно, я не хочу, чтобы что-либо еще обновляло / удаляло ссылочную строку. Так что мне нужна блокировка только для чтения с внешней точки зрения .

Я не хочу, чтобы любые фантомные чтения были возможны.Я не хочу, чтобы разные версии строк были возможны, очевидно.

После того, как транзакция сделана, хорошо, чтобы таблица A была изменена, потому что триггер (после удаления) обнулит ссылку в таблице B.

Вот что у меня есть:

BEGIN TRAN
-- test
IF NOT EXISTS (
  SELECT  1
  FROM    Table1
  WITH    (HOLDLOCK, ROWLOCK)
  WHERE   (ID = @ID)
  ) {throw}

  {perform insert into Table2}
COMMIT TRAN

1 Ответ

1 голос
/ 13 декабря 2010

Установите уровень изоляции транзакции на REPEATABLE READ на время транзакции.По моему мнению, это также предпочтительнее, чем использовать блокировку HINTS из-за повышенной ясности реализации вашего кода.

Поскольку вы читаете только одну строку, вам не нужно беспокоиться о вставках диапазона в ваш набор., предостережение о REPEATABLE READ.

Предлагаю прочитать главу «Блокировка и защелки» в книге Внутренние компоненты и устранение неполадок профессионального SQL Server 2008 .Он содержит отличные объяснения, включая примеры кода, различных уровней изоляции, доступных в SQL Server, а также описание механизмов каждого из сценариев аномалий данных, таких как фантомы и т. Д.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я нев платежной ведомости за это название, но у меня есть две копии, одна в твердом переплете, а другая - в журнале Kindle, и как хорошо, что я купил его дважды!

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