Azure SQL 数据库 - 处理和识别并发事务

Azure SQL DB - Handling and identifying concurrent transactions

我使用 Azure SQL 数据库(单一数据库、基本、DTU、预配置)。隔离级别默认 is_read_committed_snapshot_on = 1.

要求是在 table 中锁定一条记录,如果它即将被更新。锁定期间...

#1。应允许其他用户阅读整个 table(包括正在更新的行)。

#2。应允许其他用户更新其他记录(正在更新的记录除外)。

#3。应该允许其他用户识别谁锁定了该行(即,识别锁的查询,传递记录的 Table 名称和 PK。)

对于 #1,提示 SELECTUPDLOCK 完成了工作。

对于#2,我尝试了 UPDLOCKROWLOCKREADPAST 的不同组合。所有人都在 IX 模式下锁定整个 table(对象),在 U 模式下锁定 RID。因此,它会阻止其他用户更新 table 中的其他记录。如何让其他用户(会话)更新table?

的其他行

对于 #3,通过 table name/SPID,并使用 DMV dm_tran_locksdm_exec_sessions 我们可以确定这个 table 被锁定这个用户。直到行级别(使用 PK)查询如何才能正常? (即,如果两个用户锁定了不同的两行,我们如何识别用户A锁定了行1,用户B锁定了行2?)可能吗?

非常感谢您的帮助!

提前致谢!

(object) in IX mode and RID in U

table 级 IX 和 RID U 锁不会阻止其他会话更新其他行。仔细检查您的索引,特别是考虑添加聚集索引而不是使用堆 table.

How can the query be fine till the row level (using PK)?

没有很好的方法来做到这一点。 sys.dm_trans_locks.resource_description 将匹配锁定行的 %%lockres%% 未记录的虚拟列。但是其他会话无法读取锁定的行,您必须扫描整个 table 以查找匹配项。如果你真的需要这个,你可以引入一个额外的table,你可以在其中为拥有锁的会话插入(ID,session_id)。