SQL 锁

1、获取当前发生死锁的信息

-- 查询死锁信息
SELECT
    dl.resource_type, -- 资源类型(如表、页、行)
    dl.request_mode, -- 锁请求模式(如共享、独占)
    dl.request_session_id, -- 请求锁的会话ID
    OBJECT_NAME(p.object_id) AS '表名', -- 与锁相关联的对象名称
		wt.wait_duration_ms AS '等待时间(毫秒)', -- 锁请求等待的时间
		wt.wait_type AS '等待类型',
		s.login_name AS '登录名',
    s.host_name AS '主机名',
    s.program_name AS '程序名称'
FROM sys.dm_tran_locks dl
JOIN sys.partitions p ON dl.resource_associated_entity_id = p.hobt_id
JOIN sys.dm_os_waiting_tasks wt ON dl.lock_owner_address = wt.resource_address
JOIN sys.dm_exec_sessions s ON wt.blocking_session_id = s.session_id
WHERE dl.request_status = 'WAIT' -- 获取当前处于等待状态的锁

  1. 使用sys.dm_tran_locks视图和sys.partitions系统视图进行连接查询。
  2. sys.dm_tran_locks视图中,选择以下列:
    • resource_type:表示锁定的资源类型,例如表、页、行等。
    • request_mode:表示锁请求的模式,例如共享锁、排他锁等。
    • request_session_id:表示正在请求锁的会话ID。
  3. sys.partitions系统视图中,使用resource_associated_entity_id列与sys.dm_tran_locks视图中的resource_associated_entity_id列进行关联。这样可以获取与锁相关联的表的对象ID。
  4. 使用OBJECT_NAME函数将对象ID转换为对象名称,以便更好地理解锁定的对象。
   5.添加过滤条件WHERE dl.request_status = 'WAIT',仅检索当前处于等待状态的锁。

二、视图 sys.dm_tran_locks

1、resource_type 

resource_type含义
DATABASE表示锁定的是整个数据库
FILE表示锁定的是数据库文件
OBJECT表示锁定的是数据库对象,如表、视图等
PAGE表示锁定的是数据页
EXTENT表示锁定的是区段
HOBT表示锁定的是堆组织的表的行
KEY表示锁定的是索引键
RID表示锁定的是行标识符
APPLICATION表示锁定的是应用程序自定义资源
METADATA表示锁定的是元数据资源

2、request_mode


  1. resource_type: DATABASE
    • request_mode: Sch-S (模式锁)
    • request_mode: Sch-M (模式锁)
  2. resource_type: OBJECT
    • request_mode: Sch-S (共享模式锁)
    • request_mode: Sch-M (排它模式锁)
    • request_mode: IS (只读共享锁)
    • request_mode: IX (读取和写入的区域共享锁)
    • request_mode: IU (读取和写入的区域更新锁)
    • request_mode: SIU (只读的区域更新锁)
    • request_mode: S (共享锁)
    • request_mode: U (更新锁)
    • request_mode: X (排它锁)
  3. resource_type: PAGE
    • request_mode: S (共享锁)
    • request_mode: U (更新锁)
    • request_mode: X (排它锁)
  4. resource_type: KEY
    • request_mode: S (共享锁)
    • request_mode: U (更新锁)
    • request_mode: X (排它锁)

3、锁类型

  1. 共享锁 (Shared Lock):    读锁
    • 锁类型: S
    • 多个事务可以同时持有共享锁。
    • 共享锁允许并发读取,但不允许对数据进行修改。
    • 其他事务可以同时持有共享锁,但不能持有排它锁。
  2. 更新锁 (Update Lock):
    • 锁类型: U
    • 更新锁是在读取数据时获取的锁,表示事务计划修改数据。
    • 更新锁允许多个事务同时持有共享锁,但不允许其他事务持有排它锁。
    • 当事务升级为排它锁时,它会保持更新锁的持有,以防止其他事务获取排它锁。
  3. 排它锁 (Exclusive Lock):   写锁
    • 锁类型: X
    • 排它锁是最严格的锁,用于防止其他事务对数据进行读取或修改。
    • 排它锁在事务修改数据时获取,阻止其他事务获取共享锁或排它锁。
    • 只有一个事务可以持有排它锁,其他事务必须等待锁的释放。

这些锁是用于控制并发访问数据库中的数据的机制,确保数据的一致性和隔离性。不同的锁类型在事务并发访问时会有不同的行为和规则。具体的锁行为和使用方式可能因数据库管理系统和配置而有所不同,建议参考相关文档以获取更详细的信息。



posted @ 2023-08-28 10:50  不争丶  阅读(43)  评论(0编辑  收藏  举报