SQL Server ROWLOCK через SELECT, если не существует транзакции INSERT - PullRequest
6 голосов
/ 02 декабря 2010

Я обновил SQL Server 2005 до 2008. Я помню, что в 2005 году ROWLOCK просто не работал, и мне пришлось использовать PAGELOCK или XLOCK для достижения любого типа фактической блокировки.Я знаю, читатель этого спросит "что ты сделал не так?"Ничего такого.Я убедительно доказал, что могу редактировать строку «ROWLOCKED», но не смог, если бы повысил уровень блокировки.У меня не было возможности проверить, работает ли это в SQL 2008. Мой первый вопрос: кто-нибудь сталкивался с этой проблемой в 2008 году?

Мой второй вопрос заключается в следующем.Я хочу проверить, существует ли значение, и если да, выполнить обновление соответствующих столбцов, а не вставку всей строки.Это означает, что если строка найдена, ее необходимо заблокировать, поскольку процедура обслуживания может удалить этот промежуточный процесс строки, вызывая ошибку.

Чтобы проиллюстрировать принцип, будет ли работать следующий код?

BEGIN TRAN

SELECT      ProfileID
FROM        dbo.UseSessions
WITH        (ROWLOCK)
WHERE       (ProfileID = @ProfileID)
OPTION      (OPTIMIZE FOR (@ProfileID UNKNOWN))

if @@ROWCOUNT = 0 begin
    INSERT INTO dbo.UserSessions (ProfileID, SessionID)
    VALUES      (@ProfileID, @SessionID)
end else begin
    UPDATE      dbo.UserSessions
    SET         SessionID = @SessionID, Created = GETDATE()
    WHERE       (ProfileID = @ProfileID)
end

COMMIT TRAN

1 Ответ

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

объяснение ...

  • ROWLOCK / PAGELOCK - это зернистость
  • XLOCK - режим

Степень детализации, уровень изоляции и режим ортогональны.

  • Гранулярность = что заблокировано = строка, страница, таблица (PAGLOCK, ROWLOCK, TABLOCK)

  • Уровень изоляции = длительность блокировки, параллелизм (HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • Режим = совместное использование / эксклюзивность (UPDLOCK, XLOCK)

  • "комбинированный", например NOLOCK, TABLOCKX

XLOCK заблокировал бы строку исключительно так, как вы хотите. ROWLOCK / PAGELOCK не будет иметь.

...