SQL Server ROWLOCK вместо SELECT если не существует INSERT transaction

Я обновил 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
6
задан IamIC 2 December 2010 в 20:04
поделиться