SQL 数据库表是否已经被上锁或死锁的预判

发布于:2025-06-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

1.SQL锁的介绍

锁是资料库DB对操作的同一个资源的管理机制。

2 锁的说明

锁模式 说明
共享 (S) 用于不更改或不更新数据的读取操作,如 SELECT 语句。
更新 (U) 用于可更新的资源中。
防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
在可重复读或可序列化事务中,此事务读取数据 [获取资源(页或行)的共享锁(S 锁)],然后修改数据 [此操作要求锁转换为排他锁(X 锁)]。
排他 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE
确保不会同时对同一资源进行多重更新。
意向 用于建立锁的层次结构, 共享锁(S 锁)或排他锁(X 锁)
意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。
架构 在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。
键范围 当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。
使用短事务:尽量保持事务简短并频繁提交,以减少锁定资源的时间。

3.锁的查询

  SELECT o.name, --表名A 
         OBJECT_NAME(resource_associated_entity_id) tableName,  --表名A
		 DB_NAME(l.resource_database_id) AS database_name,--数据库名
		 l.resource_type,                       --锁定资源的类型:DATABASE、OBJECT、PAGE等
		 l.resource_description,                --提供有关锁定资源的详细信息(如表名或索引名
		 l.request_mode,                        -- 锁模式:S(共享)、X(排他)、IS、IX等
		 l.request_status,                      -- 锁状态:GRANT(已获得)、WAIT(等待)
		 l.request_owner_type,                  -- 锁拥有者类型

	    *
    FROM sys.dm_tran_locks l 
    JOIN sysobjects o ON l.resource_associated_entity_id = o.id 
    WHERE --o.name = 'XX' AND        --把实际表名 'XX'
	  l.resource_type = 'OBJECT' 
      AND l.request_status = 'GRANT' 
      AND l.request_mode IN ('X','IX','SIX');
SELECT
    l.request_session_id AS spid,
    s.host_name AS machine_name,           -- 机器号/主机名
    s.nt_domain AS windows_domain,         -- Windows域名
    s.nt_user_name AS windows_user,        -- Windows用户名 (机器用户)
    s.login_name AS sql_login_user,        -- SQL Server登录用户
    s.original_login_name AS original_login, -- 原始登录名
    s.program_name AS program,             -- 应用程序名
    OBJECT_NAME(l.resource_associated_entity_id) AS tableName,
    l.resource_type,
    l.resource_description,
    l.request_mode,                        -- 锁模式:S(共享)、X(排他)、IS、IX等
    l.request_status,                      -- 锁状态:GRANT(已获得)、WAIT(等待)
    l.request_owner_type,                  -- 锁拥有者类型
    DB_NAME(l.resource_database_id) AS database_name,
    s.last_request_start_time             -- 最后请求时间
FROM sys.dm_tran_locks l
         INNER JOIN sys.dm_exec_sessions s ON l.request_session_id = s.session_id
WHERE l.resource_type = 'OBJECT'
ORDER BY l.request_session_id, tableName;


网站公告

今日签到

点亮在社区的每一天
去签到