我已经从 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