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,提示 SELECT
和 UPDLOCK
完成了工作。
对于#2,我尝试了 UPDLOCK
和 ROWLOCK
、READPAST
的不同组合。所有人都在 IX
模式下锁定整个 table(对象),在 U
模式下锁定 RID。因此,它会阻止其他用户更新 table 中的其他记录。如何让其他用户(会话)更新table?
的其他行
对于 #3,通过 table name/SPID,并使用 DMV dm_tran_locks
和 dm_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)。
我使用 Azure SQL 数据库(单一数据库、基本、DTU、预配置)。隔离级别默认 is_read_committed_snapshot_on = 1.
要求是在 table 中锁定一条记录,如果它即将被更新。锁定期间...
#1。应允许其他用户阅读整个 table(包括正在更新的行)。
#2。应允许其他用户更新其他记录(正在更新的记录除外)。
#3。应该允许其他用户识别谁锁定了该行(即,识别锁的查询,传递记录的 Table 名称和 PK。)
对于 #1,提示 SELECT
和 UPDLOCK
完成了工作。
对于#2,我尝试了 UPDLOCK
和 ROWLOCK
、READPAST
的不同组合。所有人都在 IX
模式下锁定整个 table(对象),在 U
模式下锁定 RID。因此,它会阻止其他用户更新 table 中的其他记录。如何让其他用户(会话)更新table?
对于 #3,通过 table name/SPID,并使用 DMV dm_tran_locks
和 dm_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)。