Sql Server Ignore rowlock hint

Это общий вопрос о том, как заблокировать диапазон значений (и ничего больше!), Когда они не существуют в таблице пока нет. Триггером для вопроса было то, что я хочу выполнить «вставить, если не существует», я не хочу использовать MERGE , потому что мне нужно поддерживать SQL Server 2005.

В первом соединении я:

  1. начать транзакцию
  2. выбрать данные из таблицы, используя (SERIALIZABLE, ROWLOCK) + где предложение для повторного определения диапазона
  3. wait ...

Во втором соединении я вставляю данные в таблица со значениями, которые не соответствуют предложению 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');

Обратите внимание, что второй запрос не заканчивается, пока не завершится транзакция в первом окне.

5
задан marc_s 4 December 2011 в 11:13
поделиться