首页 > 数据库 >识别阻塞查询和 SQL Server 阻塞原因的技术

识别阻塞查询和 SQL Server 阻塞原因的技术

时间:2023-07-31 14:25:38浏览次数:52  
标签:事务 阻塞 Server SQL 进程 执行

由数据库对象锁定导致的进程阻塞是一个常见问题。锁定通过强制每个执行的 SQL Server 事务通过ACID测试来确保数据库中存储的数据的完整性。它认为每笔交易都必须满足以下要求:

  • 原子性——事务要么在执行时完全完成,要么根本不执行
  • 一致性——事务必须创建一个有效的新数据状态,或者如果发生任何故障,它必须将所有数据返回到事务执行/启动之前的实际状态
  • 隔离性——正在执行且尚未提交的事务必须与所有其他事务隔离
  • 持久性– 提交的数据必须以某种方式保存,如果事务在系统故障和重新启动时未完成,则可以将数据保持在正确的状态

作为 ACID 测试的一部分,隔离是通过锁定影响对象来执行的,因此,隔离可以影响一个或多个数据行,直到提交针对该对象执行的 SQL Server 事务为止。这意味着,实际上,通过锁定对象,SQL Server 将阻止任何其他进程对该对象中的数据进行任何更改,直到通过提交更改或回滚更改来删除锁定。

对对象施加锁定将导致对锁定对象施加请求的任何其他进程等待,直到锁定被删除,这将延迟该进程的执行。事务等待锁被移除或停止时的状态就是所谓的块。SQL Server 被设计成以这种方式工作,因此,块本身并不是有问题的。因此,只有当在 SQL Server 上检测到高级别块或发生需要过多时间才能解决的块时,才应将其视为潜在问题

SQL Server 阻塞的一个实际示例是,当事务 #1 尝试更新表 A 中的数据时,当事务 #1 仍在运行且未完成时,事务 #2 尝试在表 A 上放置新锁;如果应删除的行也是事务 #2 将更新的行,则事务 #2 将遇到阻塞。这是因为事务 #1 在事务运行时对表施加了排他锁

我们以下面的脚本为例

Script 1

BEGIN TRAN
UPDATE [dbo].[TableX]
   SET [ZAP_ID] = 5
 WHERE [ZAP_ID] = 9

COMMIT

Script 2a

DELETE FROM [dbo].[TableX]
    WHERE [ZAP_ID] = 9

Script 2b

SELECT COUNT(*) FROM [dbo].[TableX]

Script 2c

TRUNCATE TABLE [dbo].[TableX]

These scripts will be used for creating a SQL Server block

首先,执行脚本1,但只执行黄色突出显示的部分(不执行COMMIT命令)。该脚本将启动一个事务,并将锁定 TableX 中的特定行

现在,执行任何其他脚本,它们将无法完成,因为初始事务将在 TableX 中其他脚本尝试访问的相同行上持有其独占锁。因此,脚本必须等待事务完成(以执行事务的 COMMIT)

这个简单的示例说明了一种情况,即一个正在进行的事务可以阻止一个或多个进程,这些进程必须等待具有排他锁的事务完成或回滚

那么我们如何识别 SQL Server 阻塞的实例呢?在 SQL Server 中,有多种方法可以实现此目的:

  • 使用活动监视器
  • 使用 SQL Server DMV

使用活动监视器

活动监视器是一个 SQL Server Management Studio 工具,使用户能够查看现有 SQL Server 连接的详细信息,并且可用于显示有关 SQL Server 资源上打开的进程和锁定的信息。

要在 SQL Server Management Studio 中打开活动监视器,请右键单击对象资源管理器中的 SQL Server 名称,然后单击活动监视器

展开进程并找到正在等待的进程。找到进程后,查看“阻塞者”列以查找导致阻塞的进程 ID

现在,当识别出导致阻塞的进程时,它必须位于同一进程页面中

现在,当找到有关导致阻塞的进程的信息时,用户可能会选择终止该进程或允许其运行直至完成。要终止该进程,请右键单击它并选择“终止进程”

使用DMV

动态管理视图 sys.dm_exec_request 用于识别 SQL Server 块。它可用于通过执行以下查询来列出当前活动的块

USE [master]
GO
SELECT  session_id,
blocking_session_id,
wait_time,
wait_type,
last_wait_type,
wait_resource,
transaction_isolati,
on_level,
lock_timeout
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
GO

 

从结果中可以看到哪个进程被阻塞(session_id)、哪个进程被阻塞(blocking_session_id)、涉及什么等待类型以及该阻塞的等待时间是多少以及涉及的资源

要终止阻塞会话(在本例中为 ID 74),请使用 KILL 命令

KILL 74
GO

 

小建议:

终止进程时要小心,并确保完全了解该进程正在做什么以及为什么会导致阻塞。当事务被终止时,该进程所做的所有数据更改都会回滚到之前的状态。

但这些本机 SQL Server 方法只能用于检测和识别活动块。在许多情况下,当检测和识别出块时,重要的是要知道这是否构成正常行为以及它是否很少发生或仅发生一次。如果没有这些信息,就无法执行所需的故障排除,因为没有有关区块的历史数据,例如阻塞频率和阻塞程度

 引用

https://solutioncenter.apexsql.com/techniques-to-identify-blocking-queries-and-other-causes-of-sql-server-blocks/

标签:事务,阻塞,Server,SQL,进程,执行
From: https://www.cnblogs.com/lkj371/p/17593302.html

相关文章

  • postgresql | sql语句表名和列名引号问题
    根据您提供的SQL查询语句:SELECT*FROM"features"WHERE"layer"="FSHFAC"LIMIT10;在语法上看起来没有问题,但在实际运行时可能会出现一些问题,这取决于数据库和数据表的结构。表名和列名引号:在SQL中,使用双引号""可以将标识符(例如表名、列名等)加以引号。但是,要确保......
  • mongodb和mysql的优缺点
    MongoDB和MySQL的优缺点对比引言在现代软件开发中,数据库是必不可少的一部分。MongoDB和MySQL是两种常见的数据库管理系统(DBMS)。本文将对它们的优缺点进行对比,帮助读者选择适合自己需要的数据库系统。MongoDBMongoDB是一个基于文档的NoSQL数据库,使用JSON格式存储数据。它的特点......
  • mogdb和mysql 插入效率
    mogdb和mysql插入效率比较在现代软件开发中,数据库是一个不可或缺的组成部分。常见的数据库有多种选择,其中包括MogDB和MySQL。本文将重点讨论这两个数据库在插入数据时的效率比较,并通过代码示例来进一步说明这一点。MogDB简介MogDB是一种基于开源的分布式关系型数据库管理系统。......
  • mysql 字符串包含某个字符
    MySQL字符串包含某个字符在MySQL中,我们常常需要对字符串进行各种操作,包括判断一个字符串是否包含某个字符。本文将介绍如何使用MySQL语句来判断字符串是否包含某个字符,以及提供相应的代码示例。使用LIKE语句MySQL中提供了LIKE语句来判断一个字符串是否包含某个字符。LIKE语句是......
  • mysql 字段加减
    MySQL字段加减操作详解在MySQL数据库中,我们经常需要对字段进行加减操作,例如累加某个字段的值、减去某个字段的值等。本文将详细介绍在MySQL中如何进行字段的加减操作,并提供几个代码示例。1.基本的加减操作MySQL提供了UPDATE语句来更新表中的数据,我们可以使用该语句进行......
  • mysql 字段改名
    MySQL字段改名在开发过程中,有时候需要对MySQL数据库中的字段进行改名。字段改名可以帮助我们更好地命名字段,提高代码的可读性和维护性。本文将介绍如何使用SQL语句和ALTERTABLE语句通过代码示例进行MySQL字段改名。什么是字段改名字段改名是指将数据库表中的某个字段的名称修改......
  • mysql 自增序列加前缀
    MySQL自增序列加前缀在MySQL数据库中,自增列是一种非常有用的特性,它可以为每一行记录自动生成唯一的标识符。然而,有时我们需要给自增列添加一个前缀,以便更好地组织和管理数据。本文将详细介绍如何在MySQL中实现自增序列加前缀的方法,并提供相应的代码示例。1.创建数据表首先,我们......
  • mysql 子查询插入
    MySQL子查询插入的实现概述在MySQL中,可以使用子查询来实现插入操作。子查询是指在一个查询语句中嵌套另一个查询语句,可以将子查询的结果作为插入的值。本文将教你如何使用MySQL子查询来实现插入操作。步骤下面是实现MySQL子查询插入的步骤:步骤描述1编写子查询语句......
  • mysql 转移符
    Mysql转义符的使用引言在Mysql中,如果需要在字符串中包含一些特殊字符,比如引号、反斜杠等,就需要使用转义符来表示这些特殊字符。本文将介绍Mysql转义符的使用方法,并以表格形式展示整个过程的步骤。步骤下面是使用Mysql转义符的步骤:步骤描述1连接到Mysql数据库2创......
  • mysql 中文转拼音
    MySQL中文转拼音在数据处理和分析中,我们经常会遇到需要将中文转换为拼音的需求。MySQL是一个功能强大的关系型数据库管理系统,它提供了一种简单的方法来实现中文转拼音的功能。本文将向您介绍如何在MySQL中实现中文转拼音的方法,并提供相应的代码示例。概述MySQL中文转拼音可以通......