Я обновил 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