繁体   English   中英

Azure SQL DB - 处理和识别并发事务

[英]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,我尝试了UPDLOCKROWLOCKREADPAST不同组合。 所有都在IX模式下锁定整个表(对象),在U模式下锁定 RID。 因此,它会阻止其他用户更新表中的其他记录。 如何允许其他用户(会话)更新表的其他行?

对于 #3,传递表名/SPID,并使用 DMV dm_tran_locksdm_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM