事务内执行UPDATE操作时,表A会持有哪种锁?X锁/S锁还是其他?
事务提交前表A的锁类型分析
针对你给出的事务代码:
BEGIN TRAN DECLARE @id UNIQUEIDENTIFIER = NEWID() UPDATE A WHERE A.id = @id
核心结论如下:
- 由于
NEWID()生成的是全新唯一标识符,表A中几乎不存在匹配@id的记录,因此该UPDATE语句不会修改任何行。 - 事务提交前,表A会持有意向排他锁(IX锁):这是因为
UPDATE属于写操作,数据库引擎会先在表级别添加IX锁,向其他事务声明“本事务可能会对表内某些行加排他锁”。由于未匹配到目标行,不会在行级别添加X锁(排他锁)。 - 补充说明:如果表A的
id是主键(聚集索引),引擎在查找不存在的@id时,可能会在索引相关节点添加短暂的共享锁(S锁),但这类锁会在查找完成后立即释放,不会持有到事务提交阶段。
内容的提问来源于stack exchange,提问作者Sergey Dev
相关产品推荐
相关产品推荐

