假设我有以下交易:
BEGIN TRAN
DECLARE @id UNIQUEIDENTIFIER = NEWID()
UPDATE A
WHERE A.id = @id
在我提交事务之前,表 A 上将持有什么样的锁? 是X锁还是S锁还是其他类型的锁?
这取决于表结构...如果 ID 列是主键并且主键没有其他列,则锁将是“行”锁:
如果 PK 是集群的,则通过“逻辑”行锁
如果 PK 是非集群的,则通过“物理”行锁
在 UPDATE 中,锁类型始终是 UPDATE 锁,当找到行时,以共享开始为独占锁。该锁的第一个共享部分禁止添加新的共享锁...以便当所有其他进程结束时共享锁可以转换为独占锁....