Это общий вопрос о том, как заблокировать диапазон значений (и ничего больше!), Когда они не существуют в таблице пока нет. Триггером для вопроса было то, что я хочу выполнить «вставить, если не существует», я не хочу использовать MERGE
, потому что мне нужно поддерживать SQL Server 2005.
В первом соединении я:
начать транзакцию
(SERIALIZABLE, ROWLOCK)
+ где предложение для повторного определения диапазона Во втором соединении я вставляю данные в таблица со значениями, которые не соответствуют предложению where в первом соединении
, я ожидаю, что второе соединение не будет затронуто первым, но оно завершится только после того, как я зафиксирую (или откат) транзакции первого подключения.
Что мне не хватает?
Вот мой тестовый код:
Сначала создайте эту таблицу:
CREATE TABLE test
(
VALUE nvarchar(100)
)
Во-вторых, откройте новое окно запроса sql server managements studio и выполните следующее:
BEGIN TRANSACTION;
SELECT *
FROM test WITH (SERIALIZABLE,ROWLOCK)
WHERE value = N'a';
В-третьих, откройте другой новое окно запроса и выполните следующее:
INSERT INTO test VALUES (N'b');
Обратите внимание, что второй запрос не заканчивается, пока не завершится транзакция в первом окне.