天空闲话 发表于 2024-9-10 06:17:06

SQL Server 查询死锁以及解决死锁的基本知识(图文)

1. 基本知识

在 SQL Server 中,死锁是指两个或多个进程相互等待对方持有的资源,从而无法继续执行的现象
要解决死锁题目,起首须要辨认并分析死锁的发生原因,然后接纳相应的步调来预防和处理死锁
辨认死锁的常用方法有以下几种:


[*]使用 SQL Server Profiler:可以捕捉死锁事件,生成死锁图
[*]使用 Extended Events:更轻量级,适用于生产环境
[*]启用死锁跟踪标志:可以使用 DBCC TRACEON 下令启用死锁跟踪标志(如 1222 或 1204),以记录死锁信息到 SQL Server 错误日志中
-- 启用死锁跟踪标志
DBCC TRACEON (1222, -1);
DBCC TRACEON (1204, -1);

-- 关闭死锁跟踪标志
DBCC TRACEOFF (1222, -1);
DBCC TRACEOFF (1204, -1);


[*]检察体系健康陈诉:SQL Server 2016 及更高版本提供的体系健康陈诉可以捕捉和记录死锁事件
https://img-blog.csdnimg.cn/direct/ad4e73954a0e41fa9f7ba8b77224477b.png
可以使用以下查询检察当前活动的进程:
-- 查看活动的进程
SELECT
    session_id,
    blocking_session_id,
    wait_type,
    wait_time,
    wait_resource,
    last_wait_type,
    status,
    command,
    sql_handle,
    statement_start_offset,
    statement_end_offset,
    plan_handle,
    database_id,
    user_id,
    cpu_time,
    reads,
    writes,
    logical_reads,
    row_count
FROM
    sys.dm_exec_requests;
截图如下:
https://img-blog.csdnimg.cn/direct/0b2551e39c0c45018f1ffb834f86287b.png
杀死特定进程
一旦确定了要终止的会话ID,可以使用以下下令终止该进程:
KILL <session_id>;-- 替换为实际的会话ID
2. 检察息争锁被锁的表

检察被锁的表
要检察当前被锁的表,可以使用以下查询:
SELECT
    request_session_id AS spid,
    OBJECT_NAME(resource_associated_entity_id) AS tableName
FROM
    sys.dm_tran_locks
WHERE
    resource_type = 'OBJECT';
截图如下所示:
https://img-blog.csdnimg.cn/direct/472a4add6d544824bf0a492757b02815.png
解锁被锁表:
DECLARE @spid INT;
SET @spid = 88;-- 替换为要终止的会话ID

DECLARE @sql VARCHAR(1000);
SET @sql = 'KILL ' + CAST(@spid AS VARCHAR);
EXEC(@sql);
3. 检察和处理数据库堵塞

检察数据库是否堵塞
要检察数据库中的堵塞情况,可以使用以下查询:
SELECT *
FROM sys.sysprocesses
WHERE blocked <> 0;
截图如下:
https://img-blog.csdnimg.cn/direct/27dc4e68fb6946d5b75fe06a5978ad01.png
这个查询会返回全部被壅闭的进程,blocked 列表示当前进程被哪个进程壅闭
根据ID查找对应的SQL进程
要检察特定会话正在执行的SQL语句,可以使用以下下令:(表现指定会话正在执行的末了一条SQL语句)
DBCC INPUTBUFFER(110);-- 替换为实际的会话ID

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SQL Server 查询死锁以及解决死锁的基本知识(图文)