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