【发布时间】:2021-09-04 00:53:57
【问题描述】:
我使用 Azure SQL DB(单 DB、基本、DTU、预配置)。隔离级别默认为 is_read_committed_snapshot_on = 1。
要求是锁定表中的记录,如果它即将被更新。锁定期间...
#1。应该允许其他用户读取整个表(包括正在更新的行)。
#2。应该允许其他用户更新其他记录(正在更新的记录除外)。
#3。应该允许其他用户识别谁锁定了该行(即,一个查询来识别锁,传递表名和记录的PK。)
对于 #1,提示 SELECT 和 UPDLOCK 可以完成这项工作。
对于#2,我尝试了UPDLOCK 和ROWLOCK、READPAST 的不同组合。所有人都在IX 模式下锁定整个表(对象),在U 模式下锁定RID。因此,它会阻止其他用户更新表中的其他记录。如何允许其他用户(会话)更新表的其他行?
对于#3,传递表名/SPID,并使用DMV dm_tran_locks 和dm_exec_sessions,我们可以确定该表已被该用户锁定。在行级别(使用 PK)之前,查询如何才能正常? (即如果两个用户锁定了两个不同的行,我们如何识别用户 A 锁定了第 1 行,而用户 B 锁定了第 2 行?)有可能吗?
非常感谢您的帮助!
提前致谢!
【问题讨论】:
标签: sql-server locking isolation-level