[英]Azure SQL DB - Handling and identifying concurrent transactions
我使用 Azure SQL DB(Single DB、Basic、DTU、Provisioned)。 隔离级别默认为 is_read_committed_snapshot_on = 1。
要求是锁定表中的记录,如果它即将被更新。 在锁定期间...
#1. 应该允许其他用户读取整个表(包括正在更新的行)。
#2. 应该允许其他用户更新其他记录(被更新的用户除外)。
#3. 应该允许其他用户识别谁锁定了该行(即识别锁定的查询,传递记录的表名和 PK。)
对于#1,带有UPDLOCK
的提示SELECT
可以完成这项工作。
对于#2,我尝试了UPDLOCK
与ROWLOCK
和READPAST
不同组合。 所有都在IX
模式下锁定整个表(对象),在U
模式下锁定 RID。 因此,它会阻止其他用户更新表中的其他记录。 如何允许其他用户(会话)更新表的其他行?
对于 #3,传递表名/SPID,并使用 DMV dm_tran_locks
和dm_exec_sessions
我们可以识别该表已被该用户锁定。 查询如何在行级别(使用 PK)之前正常? (即,如果两个用户锁定了两个不同的行,我们如何确定用户 A 锁定了第 1 行,而用户 B 锁定了第 2 行?)可能吗?
非常感谢您的帮助!
提前致谢!
(对象)在 IX 模式和 RID 在 U
表级 IX 和 RID U 锁不会阻止其他会话更新其他行。 仔细检查您的索引,特别是考虑添加聚集索引而不是使用堆表。
查询如何在行级别(使用 PK)之前正常?
没有什么好的方法可以做到这一点。 sys.dm_trans_locks.resource_description
将匹配锁定行的%%lockres%%
未记录的虚拟列。 但是其他会话无法读取锁定的行,您必须扫描整个表以查找匹配项。 如果你真的需要这个,你可以引入一个额外的表,你可以在其中为拥有锁的会话插入 (ID,session_id)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.