gpt4 book ai didi

sql-server - 如果不存在 INSERT 事务,则 SQL Server 对 SELECT 进行 ROWLOCK

转载 作者:行者123 更新时间:2023-12-02 17:55:41 26 4
gpt4 key购买 nike

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

最佳答案

解释...

  • ROWLOCK/PAGELOCK 是粒度
  • XLOCK 是模式

粒度与隔离级别和模式是正交的。

  • 粒度 = 锁定的内容 = 行、页、表(PAGLOCK、ROWLOCK、TABLOCK)

  • 隔离级别 = 锁定持续时间、并发性(HOLDLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE)

  • 模式 = 共享/独占(UPDLOCK、XLOCK)

  • “组合”,例如NOLOCK、TABLOCKX

XLOCK 会按照您的需要独占锁定该行。 ROWLOCK/PAGELOCK 就没有。

关于sql-server - 如果不存在 INSERT 事务,则 SQL Server 对 SELECT 进行 ROWLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com