Lock:Escalation 事件类指示细粒度的锁被转换为粗粒度锁,例如,行锁被转换为对象锁。 升级事件类为事件 ID 60。
Lock:Escalation 事件类数据列
| 数据列名称 | 数据类型 | DESCRIPTION | 列 ID | 可筛选 |
|---|---|---|---|---|
| ApplicationName | nvarchar |
创建到 SQL Server 实例连接的客户端应用程序的名称。 此列由应用程序传递的值填充,而不是由所显示的程序名填充。 | 10 | 是的 |
| ClientProcessID | int |
主机为运行该客户端应用程序的进程分配的 ID。 如果客户端提供了客户端进程 ID,则填充此数据列。 | 9 | 是的 |
| DatabaseID | int |
获取锁的数据库 ID。 如果在跟踪中捕获 ServerName 数据列且服务器可用,SQL Server Profiler 将显示数据库名称。 可使用 DB_ID 函数来确定数据库的值。 | 3 | 是的 |
| 数据库名称 | nvarchar |
发生升级的数据库的名称。 | 35 | 是的 |
| EventClass | int |
事件类型 = 60。 | 二十七 | 否 |
| EventSubClass | int |
锁升级的原因: 0 - LOCK_THRESHOLD 指示语句超出锁定阈值。 1 - MEMORY_THRESHOLD 指示语句超出内存阈值。 |
21 | 是的 |
| EventSequence | int |
给定事件在请求中的顺序。 | 51 | 否 |
| GroupID | int |
在其中激发 SQL 跟踪事件的工作负荷组的 ID。 | 66 | 是的 |
| HostName | nvarchar |
正在运行客户端的计算机的名称。 如果客户端提供了主机名,则填充此数据列。 若要确定主机名,请使用 HOST_NAME 函数。 | 8 | 是的 |
| IntegerData | int |
HoBT 锁计数。 锁升级时 HoBT 的锁数。 | 二十五 | 是的 |
| IntegerData2 | int |
增加的锁计数。 已转换的锁总数。 这些锁结构已解除分配,因为它们已由升级的锁覆盖。 | 55 | 是的 |
| IsSystem | int |
指示事件是发生在系统进程中还是发生在用户进程中。 1 = 系统,0 = 用户。 | 六十 | 是的 |
| LineNumber | int |
Transact-SQL 语句对应的行号。 | 5 | 是的 |
| LoginName | nvarchar |
用户的登录名(SQL Server 安全登录名或域\用户名形式的Microsoft Windows 登录凭据)。 | 11 | 是的 |
| LoginSid | image |
登录用户的安全标识号 (SID)。 你可以在 sys.server_principals 目录视图中找到此信息。 服务器中的每个登录名都具有唯一的 SID。 | 41 | 是的 |
| 模式 | int |
升级后生成的锁模式: 0=NULL - 与所有其他锁模式兼容(LCK_M_NL) 1=架构稳定性锁 (LCK_M_SCH_S) 2=架构修改锁 (LCK_M_SCH_M) 3=共享锁 (LCK_M_S) 4=更新锁 (LCK_M_U) 5=排他锁 (LCK_M_X) 6=意向共享锁 (LCK_M_IS) 7=意向更新锁 (LCK_M_IU) 8=意向排他锁 (LCK_M_IX) 9=共享以更新(LCK_M_SIU) 10=与意向独占共享 (LCK_M_SIX) 11=通过意向独占进行更新(LCK_M_UIX) 12=批量更新锁(LCK_M_BU) 13=密钥范围共享/共享(LCK_M_RS_S) 14=密钥范围共享/更新(LCK_M_RS_U) 15=键范围插入 NULL (LCK_M_RI_NL) 16=键范围插入共享 (LCK_M_RI_S) 17=关键范围插入更新(LCK_M_RI_U) 18=键范围插入独占 (LCK_M_RI_X) 19=密钥范围独占共享 (LCK_M_RX_S) 20=密钥范围独占更新 (LCK_M_RX_U) 21=键范围独占 (LCK_M_RX_X) |
32 | 是的 |
| NTDomainName | nvarchar |
用户所属的 Windows 域。 | 7 | 是的 |
| NTUserName | nvarchar |
Windows 用户名。 | 6 | 是的 |
| ObjectID | int |
触发锁定升级的表的系统分配 ID。 | 22 | 是的 |
| ObjectID2 | bigint |
相关对象或实体的 ID。 (触发锁定升级的 HoBT ID。) | 56 | 是的 |
| 偏移量 | int |
Transact-SQL 语句的起始偏移量。 | 61 | 是的 |
| OwnerID | int |
1=交易 2=光标 3=会话 4=共享事务工作空间 5=独占事务工作区 6=WAITFOR_QUERY |
58 | 是的 |
| RequestID | int |
包含该语句的请求的 ID。 | 49 | 是的 |
| ServerName | nvarchar |
要跟踪的 SQL Server 实例的名称。 | 26 | 否 |
| SessionLoginName | nvarchar |
发起会话的用户的登录名。 例如,如果使用 Login1 连接到 SQL Server,并将语句作为 Login2 执行,SessionLoginName 将显示 Login1,LoginName 显示 Login2。 此列同时显示 SQL Server 和 Windows 登录名。 | 64 | 是的 |
| SPID | int |
该事件发生的会话 ID。 | 12 | 是的 |
| StartTime | datetime |
该事件(如果存在)的启动时间。 | 14 | 是的 |
| TextData | ntext |
导致锁升级的 Transact-SQL 语句的文本。 | 1 | 是的 |
| TransactionID | bigint |
系统分配的事务 ID。 | 4 | 是的 |
| 类型 | int |
锁升级粒度: 1=空资源 2=数据库 3=文件 5=对象(表级) 6=页 7=关键 8=程度 9=RID 10=应用程序 11=METADATA 12=HOBT 13=分配单元 |
57 | 是的 |
例子
以下示例使用 sp_trace_create 该过程创建跟踪,用于 sp_trace_setevent 向跟踪添加锁升级列,然后用于 sp_trace_setstatus 启动跟踪。
EXEC sp_trace_setevent @TraceID, 60, 22, 1 中的语句中,60 数字表示升级事件类别,22 表示 ObjectID 列,并且将 1 上的跟踪事件设置为 ON。
DECLARE @RC int, @TraceID int;
EXEC @rc = sp_trace_create @TraceID output, 0, N'C:\TraceResults';
-- Set the events and data columns you need to capture.
EXEC sp_trace_setevent @TraceID, 60, 1, 1; -- 1 = TextData
EXEC sp_trace_setevent @TraceID, 60, 12, 1; -- 12 = SPID
EXEC sp_trace_setevent @TraceID, 60, 21, 1; -- 21 = EventSubClass
EXEC sp_trace_setevent @TraceID, 60, 22, 1; -- 22 = ObjectID
EXEC sp_trace_setevent @TraceID, 60, 25, 1; -- 25 = IntegerData
EXEC sp_trace_setevent @TraceID, 60, 55, 1; -- 25 = IntegerData2
EXEC sp_trace_setevent @TraceID, 60, 57, 1; -- 57 = Type
-- Set any filter by using sp_trace_setfilter.
-- Start the trace.
EXEC sp_trace_setstatus @TraceID, 1;
GO
现在跟踪正在运行,请执行要跟踪的语句。 完成后,执行以下代码以停止并关闭跟踪。 此示例使用 fn_trace_getinfo 函数来获取 traceid,该 traceid 将用于 sp_trace_setstatus 语句中。
-- After the trace is complete.
DECLARE @TraceID int;
-- Find the traceid of the current trace.
SELECT @TraceID = traceid
FROM ::fn_trace_getinfo(default)
WHERE value = N'C:\TraceResults.trc';
-- First stop the trace.
EXEC sp_trace_setstatus @TraceID, 0;
-- Close and then delete its definition from SQL Server.
EXEC sp_trace_setstatus @TraceID, 2;
GO
另请参阅
sp_trace_setevent(Transact-SQL)
sys.dm_tran_locks(Transact-SQL)