AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 244054
Accepted
Forrest
Forrest
Asked: 2019-07-30 08:20:41 +0800 CST2019-07-30 08:20:41 +0800 CST 2019-07-30 08:20:41 +0800 CST

为什么这个 RX-X 锁没有出现在扩展事件中?

  • 772

问题

我有一对查询,在可序列化的隔离下,会导致 RX-X 锁定。但是,当我使用扩展事件观看锁获取时,RX-X 锁获取永远不会出现,它只是被释放。它从何而来?

复制品

这是我的桌子:

CREATE TABLE dbo.LockTest (
ID int identity,
Junk char(4)
)

CREATE CLUSTERED INDEX CX_LockTest --not unique!
ON dbo.LockTest(ID)

--preload some rows
INSERT dbo.LockTest
VALUES ('data'),('data'),('data')

这是我的问题批次:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

INSERT dbo.LockTest
VALUES ('bleh')

SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()

--ROLLBACK

我检查了这个会话持有的锁,并查看了 RX-X:

SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!

dm_tran_locks

lock_acquired但我在和上也有一个扩展事件lock_released。我在适当的 associated_object_id 上对其进行过滤……没有 RX-X。

扩展事件输出

执行回滚后,我看到 RX-X (LAST_MODE) 已释放,即使它从未被获取。

LAST_MODE

我试过的

  • 我查看了扩展事件中的所有锁 - 没有过滤。未获得 RX-X 锁。

  • 我也尝试了 Profiler: 相同的结果(当然除了它的名字是正确的......没有“LAST_MODE”)。

  • 我运行 XE 进行锁定升级 - 它不存在。

  • 没有专门用于转换的 XE,但我能够确认至少 U 到 X 锁定转换是由lock_acquired

另外值得注意的是被收购但从未发布的 RI-N。我目前的假设是 RX-X 是转换锁,如此处所述。我的批次中有重叠的键范围锁,看起来它们应该有资格进行转换,但 RX-X 锁不在转换表中。

这个锁是从哪里来的,为什么不被扩展事件拾取?

sql-server locking
  • 1 1 个回答
  • 395 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2019-07-30T17:11:17+08:002019-07-30T17:11:17+08:00

    单行插入获取X新行上的(独占)锁。

    SELECT尝试获取范围共享的密钥共享 ( )RangeS-S锁。

    此请求由lock_acquired扩展事件报告为 mode = RS_S。

    Profiler 事件类将其报告Lock:Acquired为模式 13 ( LCK_M_RS_S)。

    请求的模式与 in中现有的独占锁模式相结合。没有范围共享,键独占()的组合模式,因此计算的结果是范围独占,键独占(),恰好是模式15。Lock::CalculateGrantModesqlmin.dllRangeS-XRangeX-X

    上面的授权模式计算是在扩展事件生成之前执行的lck_ProduceExtendedEvent<XeSqlPkg::lock_acquired>。尽管如此,Profiler 和 Extended Events 都会记录请求 RangeS-S的模式,而不是生成的锁定模式RangeX-X。这与有限的文档相反,它说:

    模式 | 整数| 获取锁后的结果模式。

    扩展事件的模式栏根本没有文档,元数据中的描述是空白的。也许微软自己甚至不确定这种行为。

    我经常认为如果锁定事件同时报告请求模式和结果模式会更有用,但这不是我们所拥有的。当前的安排使得几乎不可能跟踪和匹配锁的获取和释放。

    以这种方式报告锁可能有充分的理由。如果它不能满足你的需求,你可以向 Microsoft 开一个支持案例,或者创建一个 Azure 反馈项。


    LAST_MODE

    神秘LAST_MODE是埃里克·达林(Erik Darling)以前说过的。它是map_key公开的锁定模式列表中的最大值sys.dm_xe_map_values:

    SELECT
        DXMV.map_key,
        DXMV.map_value
    FROM sys.dm_xe_map_values AS DXMV
    WHERE 
        DXMV.[name] = N'lock_mode'
    ORDER BY
        DXMV.map_key;
    
    ╔═════════╦═══════════╗
    ║ map_key ║ map_value ║
    ╠═════════╬═══════════╣
    ║       0 ║ NL        ║
    ║       1 ║ SCH_S     ║
    ║       2 ║ SCH_M     ║
    ║       3 ║ S         ║
    ║       4 ║ U         ║
    ║       5 ║ X         ║
    ║       6 ║ IS        ║
    ║       7 ║ IU        ║
    ║       8 ║ IX        ║
    ║       9 ║ SIU       ║
    ║      10 ║ SIX       ║
    ║      11 ║ UIX       ║
    ║      12 ║ BU        ║
    ║      13 ║ RS_S      ║
    ║      14 ║ RS_U      ║
    ║      15 ║ RI_NL     ║
    ║      16 ║ RI_S      ║
    ║      17 ║ RI_U      ║
    ║      18 ║ RI_X      ║
    ║      19 ║ RX_S      ║
    ║      20 ║ RX_U      ║
    ║      21 ║ LAST_MODE ║
    ╚═════════╩═══════════╝
    

    通过 DMV 访问的内存结构(使用sqlmin!CMapValuesTable)存储在地址 开始sqlmin!XeSqlPkg::g_lock_mode。结构中的每个 16 字节条目都包含和指向流 TVFmap_key返回的字符串的指针。map_value

    字符串完全按照上表所示存储(尽管不是按该顺序)。map_value条目 21 具有“LAST_MODE”而不是预期的“RX_X”似乎是一个错误。Erik Darling在 Azure 反馈上报告了该问题。

    • 12

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve