查找sqlserver查询死锁源头的方法 sqlserver死锁监控

yizhihongxing

下面是关于“查找 SQL Server 查询死锁源头的方法 SQL Server 死锁监控”完整攻略,包括以下步骤:

前置条件

在进行 SQL Server 死锁监控之前,需要先了解四个基本概念:

  1. 锁(Lock):在 SQL Server 中,锁是防止并发访问进行数据访问的机制。

  2. 事务(Transaction):事务是执行一系列相关的操作并形成一个逻辑单元,且该逻辑单元要么全部执行,要么全部取消。

  3. 互斥性(Mutual Exclusion):在同一时间只有一个事务可以持有一个锁。

  4. 死锁(Deadlock):死锁是指当两个或多个事务都互相持有彼此所需的资源时,它们将会陷入一种懊恼的状态,不能再向前或向后移动。

步骤

接下来,介绍以下针对 SQL Server 数据库死锁问题进行监控和查找的完整攻略:

  1. 启用 SQL Server Profiler 进行监控。

    在 SQL Server Profiler 中,选择 "Tuning" 模板并启动此模板。监控过程中启用 "Deadlock graph" 选项,以显示死锁图。"Deadlock graph" 选项将显示导致锁死的事务,并提供详细信息,例如死锁的事务、锁类型、等待时间等。监控结束后,可以使用 "Show Deadlock XML" 选项查看死锁的 XML 信息。

    以下是一个 SQL Server Profiler 监控死锁的示例:

    sql
    USE AdventureWorks2012;
    GO
    SET NOCOUNT ON;
    BEGIN TRAN
    UPDATE Production.ProductInventory
    SET Quantity = Quantity - 10
    WHERE ProductID = 980;
    -- Wait for a delay to simulate another query attempting to read
    -- uncommitted data.
    WAITFOR DELAY '00:00:03';
    -- Attempt to read uncommitted data. The query is blocked
    -- because of locking conflicts.
    SELECT ProductID, Quantity
    FROM Production.ProductInventory WITH (NOLOCK)
    WHERE ProductID = 980;
    ROLLBACK TRAN;

  2. 使用 "Activity Monitor" 工具进行查找。

    在 SSMS 中,选择 "Activity Monitor" 工具。选择 "Processes" 选项卡,并按 SQL Server 数据库实例名称。在 "Processes" 选项卡中,将鼠标指针悬停在 "Block By" 列的 "0" 值上。这将显示一个下拉框,其中包含所有正在阻塞的进程以及阻塞它们的进程。可以单击每个进程来查看详细信息。另外,在工具栏中选择 "Deadlock Graph" 选项卡,以查看死锁图。

    以下是 Activity Monitor 工具查找死锁的示例:

    sql
    CREATE PROCEDURE DeadlockTrace
    AS
    BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    DECLARE @XMLData XML;
    SET @XMLData =(SELECT
    -- Filter for date range, optional
    CAST(record AS XML)
    FROM sys.fn_trace_gettable(CONVERT(VARCHAR(MAX)), 0)
    WHERE TextData LIKE '%deadlock-list%'
    AND StartTime >= DATEADD(MINUTE,-60, GETDATE()))
    SELECT
    DL.eventDate, DL.DeadlockGraph
    FROM (
    SELECT
    CONVERT(DATETIME, LEFT(TXT.text, 23), 121) AS eventDate, STUFF(
    CAST(
    ( SELECT CAST(TXT2.text AS VARCHAR(MAX))
    FROM sys.dm_exec_connections AS C
    CROSS APPLY sys.dm_exec_sql_text(C.most_recent_sql_handle) AS TXT2
    WHERE C.session_id = DEADLOCK.session_id
    FOR XML PATH('treedata'), TYPE
    )AS VARCHAR(MAX)
    ), 1, 2, '' ) + '' AS DeadlockGraph
    FROM sys.dm_exec_connections AS C
    CROSS APPLY sys.dm_exec_sql_text(C.most_recent_sql_handle) AS TXT
    CROSS APPLY @XMLData.nodes('/Root/Deadlock')AS DEADLOCK(Deadlock)
    WHERE TXT.text LIKE '%process id%'
    AND C.session_id = DEADLOCK.deadlock.value('@victimProcessID', 'INT')
    ) AS DL
    ORDER BY DL.eventDate DESC
    END

总结

在进行 SQL Server 死锁监控时,可以使用 SQL Server Profiler 和 Activity Monitor 工具。使用这些工具可以轻松地查找导致死锁的事务并提供有关死锁的详细信息和死锁图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:查找sqlserver查询死锁源头的方法 sqlserver死锁监控 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 聊聊Docker不适合跑 MySQL 的N个原因

    下面是关于“聊聊Docker不适合跑MySQL的N个原因”的完整攻略。 1.概述 Docker 极大地简化了应用程序的部署和管理过程,但是在运行 MySQL 这类数据库服务时,Docker 可能并不是最好的选择。在这篇文档中,我们将讨论 Docker 不适合跑 MySQL 的 N 个原因。 2.Docker 部署 MySQL 的问题 2.1. 数据持久化的问…

    database 2023年5月22日
    00
  • SQL2008 附加数据库提示 5120错误 解决办法

    SQL Server 2008 是目前广泛应用的数据库管理系统之一,然而在使用的过程中,有时候会遇到“附加数据库提示 5120 错误”的问题,本文将会介绍两种解决办法。 问题描述 在使用 SQL Server Management Studio 进行数据库附加的时候,可能会遇到以下错误提示: 操作系统错误5(Access is Denied.) 。 此时,该…

    database 2023年5月21日
    00
  • Redis安装使用RedisJSON模块的方法

    当我们需要高效地解析和存储JSON格式的数据时,RedisJSON模块是一个非常有用的工具。RedisJSON模块能够快速地将JSON格式的数据序列化为二进制,并使得它们能够被Redis的数据结构(如哈希表和列表)所理解和操作。以下是Redis安装使用RedisJSON模块的方法: 安装RedisJSON模块 要安装RedisJSON,我们首先需要确保已安装…

    database 2023年5月22日
    00
  • python爬取大众点评并写入mongodb数据库和redis数据库

    抓取大众点评首页左侧信息,如图: 我们要实现把中文名字都存到mongodb,而每个链接存入redis数据库。 因为将数据存到mongodb时每一个信息都会有一个对应的id,那样就方便我们存入redis可以不出错。 # -*- coding: utf-8 -*- import re from urllib.request import urlopen from…

    Redis 2023年4月11日
    00
  • redis分布式锁的实现

    一.正常加锁 当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。 具体步骤: 获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据库,释放锁资源。   二.线程出现阻塞 当A线程加锁后出现阻塞时,导致数据还没有存到数据库,锁的时间便会失效。 B线程便会执行,对数据进行加锁,成功后保存到数据库,而这时A线程启动,将数…

    Redis 2023年4月10日
    00
  • MySQL 在触发器里中断记录的插入或更新?

    MySQL 触发器是一种特殊的存储过程,它能够在特定的事件发生时自动执行代码。在某些情况下,我们需要在触发器内中断记录的插入或更新操作,这可以通过抛出异常来实现。本文将提供一种完整的攻略来实现这一操作,具体步骤如下: 1. 定义触发器 首先,我们需要定义一个触发器,该触发器能够捕获插入或更新操作。假设我们有一个名为 orders 的表,我们需要在该表上定义一…

    database 2023年5月22日
    00
  • SQL语句的基本语法

    SQL语句是结构化查询语言的缩写,用于数据库的管理、操作和查询。下面我将详细介绍SQL语句的基本语法及其使用方法。 基本语法 SQL语句的基本语法可以分为以下三个部分: 1. 关键字 关键字是SQL语句的核心部分之一,它用来指定操作类型、数据表名、查询条件等重要信息。SQL关键字大小写不敏感,但通常使用大写字母表示。以下是一些常用的SQL关键字: SELEC…

    database 2023年5月21日
    00
  • Springboot + Mysql8实现读写分离功能

    下面是Springboot + Mysql8实现读写分离功能的完整攻略及示例说明。 1. 读写分离介绍 读写分离是指将数据库中的读和写操作分配到不同的节点上进行,以提升数据库的性能和可用性。一般来说,读操作比写操作多得多,而且读操作不涉及到数据的修改,所以可以通过将读操作分配到多个节点上,从而提高数据库读取的效率。 2. Mysql8读写分离实现原理 Mys…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部