Мне кажется, что в SQL Server 2008 отсутствует что-то, что блокируется. Это мой сценарий:
- Начало передачи.
- Чтение из таблицы A, чтобы убедиться, что определенная строка найдена.
- Во время чтения установите блокировку только для чтения на чтение одной строки.Если не найдено, выведите ошибку.
- Вставьте в таблицу B, которая включает ссылку на таблицу A.
- Зафиксируйте 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