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' -- 获取当前处于等待状态的锁
- 使用sys.dm_tran_locks视图和sys.partitions系统视图进行连接查询。
- 在sys.dm_tran_locks视图中,选择以下列:
- resource_type:表示锁定的资源类型,例如表、页、行等。
- request_mode:表示锁请求的模式,例如共享锁、排他锁等。
- request_session_id:表示正在请求锁的会话ID。
- 在sys.partitions系统视图中,使用resource_associated_entity_id列与sys.dm_tran_locks视图中的resource_associated_entity_id列进行关联。这样可以获取与锁相关联的表的对象ID。
- 使用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
- resource_type: DATABASE
- request_mode: Sch-S (模式锁)
- request_mode: Sch-M (模式锁)
- 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 (排它锁)
- resource_type: PAGE
- request_mode: S (共享锁)
- request_mode: U (更新锁)
- request_mode: X (排它锁)
- resource_type: KEY
- request_mode: S (共享锁)
- request_mode: U (更新锁)
- request_mode: X (排它锁)
3、锁类型
- 共享锁 (Shared Lock): 读锁
- 锁类型: S
- 多个事务可以同时持有共享锁。
- 共享锁允许并发读取,但不允许对数据进行修改。
- 其他事务可以同时持有共享锁,但不能持有排它锁。
- 更新锁 (Update Lock):
- 锁类型: U
- 更新锁是在读取数据时获取的锁,表示事务计划修改数据。
- 更新锁允许多个事务同时持有共享锁,但不允许其他事务持有排它锁。
- 当事务升级为排它锁时,它会保持更新锁的持有,以防止其他事务获取排它锁。
- 排它锁 (Exclusive Lock): 写锁
- 锁类型: X
- 排它锁是最严格的锁,用于防止其他事务对数据进行读取或修改。
- 排它锁在事务修改数据时获取,阻止其他事务获取共享锁或排它锁。
- 只有一个事务可以持有排它锁,其他事务必须等待锁的释放。
这些锁是用于控制并发访问数据库中的数据的机制,确保数据的一致性和隔离性。不同的锁类型在事务并发访问时会有不同的行为和规则。具体的锁行为和使用方式可能因数据库管理系统和配置而有所不同,建议参考相关文档以获取更详细的信息。