当一个数据库会话中的事务正锁定一个或多个其他会话事务想要读取或修改的资源时,会产生阻塞(Blocking)。通常短时间的阻塞没有问题,且是
较忙的应用程序所需要的。然而,设计糟糕的应用程序会导致长时间的阻塞,这就不必要地锁定了资源,而且阻塞了其他会话读取和更新它们。
在SQL Server中,一个阻塞的进程会无限期地保持阻塞,或者直到它超时(根据set lock_timeout)、服务器关闭、进程被杀死、连接完成了更新或者其他发生在原始事务上的操作导致它释放了资源上的锁。
发生长时间阻塞的原因如下:
1、在一个没有索引的表上的过量的行锁会导致SQL Server得到一个锁,从而阻塞其他事务。
2、应用程序打开一个事务,并在事务保持打开的时候要求用户进行反馈或交互。这通常是让最终用户在GUI上输入数据而操持事务打开的时候发生。此时,事务引用的任何资源都会被占据。
3、事务BEGIN后查询的数据可能在事务事务开始前被调用
4、查询不恰当地使用锁定提示。例如,应用程序仅使用很少的行,但却使用一个表锁提示
5、应用程序使用长时间运行的事务,在一个事务中更新了很多行或很多表(把一个大量更新的事务变成多个更新较少的事务有助于改善并发性)
一、找到并解决阻塞进程
下面我们演示使用SQL Server动态管理视图sys.dm_os_waiting_tasks找出阻塞进程,该视图用于代替早期SQL Server版本中的系统存储过程sp_who
找出阻塞的进程后,我们使用sys.dm_exec_sql_text动态管理函数和sys.dm_exec_Connections(DMV)找出正在执行的查询的SQL文本,然后强制结束进程。
强制结束进程,我们使用kill命令。kill的用法,请参看MSDN:http://msdn.microsoft.com/zh-cn/library/ms173730.aspx
该命令有三个参数:
■
session ID
要终止的进程的会话 ID。session ID 是在建立连接时为每个用户连接分配的唯一整数 (int)。在连接期间,会话 ID
值与该连接捆绑在一起。连接结束时,则释放该整数值,并且可以将它重新分配给新的连接。使用 KILL session ID 可终止与指定的会话 ID
关联的常规非分布式事务和分布式事务。
■
UOW
标识分布式事务的工作单元 (UOW) ID。UOW 是可从 sys.dm_tran_locks 动态管理视图的
request_owner_guid 列中获取的 GUID。也可从错误日志中或通过 MS DTC 监视器获取
UOW。有关监视分布式事务的详细信息,请参阅 MS DTC 文档。使用 KILL UOW 可终止孤立的分布式事务。这些事务不与任何真实的会话
ID 相关联,与虚拟的会话 ID = '-2' 相关联。可使标识孤立事务变得更为简单,其方法是查询 sys.dm_tran_locks、sys.dm_exec_sessions
或 sys.dm_exec_requests
动态管理视图中的会话 ID 列。
■
WITH STATUSONLY
生成由于更早的 KILL 语句而正在回滚的指定 session ID 或 UOW 的进度报告。KILL WITH STATUSONLY 不终止或回滚 session ID 或 UOW,该命令只显示当前的回滚进度。
在第一个查询窗口:
第二个窗口:
第三个窗口:
可以看出是SessionID为52的会话阻塞了SessionID为54的会话。
那么,52正在干啥坏事呢?在第三个窗口中执行:
注意:这并不是第一个查询窗口中的原SQL语句,SQL Server进行了自动参数化计划缓存(预编译)。
我们强制终止会话。在第三个窗口中执行:
注意:窗口一的语句和窗口二的语句均终止。
提示:第三个语句中,使用sys.dm_exec_connections(DMV)返回了Session ID为53的
most_recent_sql_handle列。这是SQL文本在内存中的指针。作为sys.dm_exec_sql_text动态管理函数的输入参数使用。从sys.dm_exec_sql_text返回了text列,该列显示了阻塞进程的SQL文本。如果阻塞成串,必须通过blocking_session_id和session_ID列仔细查看每一个阻塞进程,直到发现原始的阻塞进程。
二、配置语句等待锁释放的时长
如果有一个事务或语句被阻塞,意味着它在等待资源上的锁被释放。我们可以事先通过set lock_Timeout来设定需要等待的时间。
语法如下:SET LOCK_TIMEOUT time_period
参数以毫秒为单位。超过时会返回锁定错误。示例:
在第一个窗口中执行:
在第二个窗口中执行:
解析:在这个示例中,我们设置了锁超时时间为1000毫秒,即1秒。这个设置不会影响资源被进程占有的时间,只会影响等待另一个进程释放资源访问的时间。
邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn
分享到:
相关推荐
在SQL Server 2008环境中,阻塞是指一个事务或操作因为某些资源(如锁、行、页等)被另一个正在运行的操作占用而无法继续执行的状态。阻塞通常会导致性能下降,并可能引发死锁等问题。 **阻塞产生的主要原因有:** ...
在探讨SQL Server中的阻塞和死锁之前,我们首先需要理解事务的基本特性——ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。 - **原子性**:事务中的所有...
总的来说,理解和处理SQL Server中的阻塞是优化数据库性能的关键步骤。优化查询、合理使用索引、控制事务大小以及适时监控和调整锁策略,都可以有效减少不必要的阻塞,提高系统的并发处理能力。
在本案例中,我们面对的是一台 Windows 2008 R2 操作系统的服务器,配置为 64 位 SQL Server 2008 R2,拥有 64GB 内存和 16 核 CPU。这是一套相当不错的硬件配置,理论上能够支持大量并发操作而不出现性能瓶颈。 ##...
一本面向想要了解SQL Server并发性以及如何解决过多的阻塞或死锁问题的DBA和开发人员的书。
MSSBlockingMonitor是一款专为SQL Server设计的阻塞监控实用程序,它可以持续监控数据库阻塞情况,提供详细的阻塞链路报告,帮助定位并解决阻塞问题。 使用MSSBlockingMonitor,你可以获取关于阻塞的详细信息,如...
- 单击“开始”按钮,然后依次选择“所有程序” > “Microsoft SQL Server 2008” > “性能工具” > “SQL Server Profiler”,即可打开 SQL Server Profiler 应用程序。 #### 三、创建跟踪 1. **新建跟踪**: -...
在SQL Server中,查询优化器会根据执行计划来决定使用哪种访问方法。对于以下四个查询: 1. `select * from inv where pn like '517%'` 2. `select * from inv where left(pn,4)='517'` 3. `select * from inv ...
《SQL Server 2012 T-SQL Recipes》是一本非常实用且内容丰富的书籍,覆盖了SQL Server 2012中的T-SQL语言的所有方面,从基础到高级,从简单查询到复杂事务处理,应有尽有。对于希望深入了解SQL Server 2012的开发者...
在SQL Server的日常使用中,可能会遇到各种各样的问题,这些问题涵盖了从数据库连接、日志管理到查询性能优化等多个方面。下面将详细讨论这些常见问题及其解决方案。 首先,我们来看SQL Server连接问题。无法连接到...
等待与阻塞问题是SQL Server中最常见的性能瓶颈之一。通过对等待类型进行深入理解,并采取相应的措施来解决这些问题,可以显著提高数据库系统的响应速度和吞吐量。此外,利用SQL Server提供的各种工具和技术,可以...
在Sql Server 中当一个数据库会话中的事务正锁定一个或多个其他会话事务想要读取或修改的资源时,会产生阻塞(Blocking)。通常短时间的阻塞没有问题,且是较忙的应用程序所需要的。然而,设计糟糕的应用程序会导致长...
我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需要的原因前,首先我想给你介绍下当更新锁(Update(U...
每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需要的原因前,首先我想给你介绍下当更新锁(Update(U)Lock)获得时,根据它的兼容...
根据提供的SQL脚本内容,我们可以看出该脚本主要用于查询MySQL数据库中出现死锁的情况,并获取相关信息,包括但不限于死锁的ID、导致死锁的具体SQL语句以及引发死锁的客户端等。通过这些信息,数据库管理员或开发...
SQL 表死锁是指在 SQL Server 中,一个或多个进程无法访问某个表或库,因为这些进程都在等待某个资源,而这个资源又被其他进程占用着。这种情况下,SQL Server 会超时,导致表或者库不可访问。 二、如何找到死锁的...
在RAC环境中,由于多个实例共享资源,可能会出现阻塞(blocking)问题,这会影响数据库的性能和正常运行。了解如何查看和处理这些阻塞情况至关重要。下面,我们将深入探讨Oracle RAC中查看阻塞的相关知识点,并基于...
在SQL Server中,如在读未提交(Read Uncommitted)或可重复读(Repeatable Read)隔离级别下,行版本控制允许事务读取数据的旧版本,而不是被其他事务修改后的版本,从而避免了锁定和阻塞。这有助于提高系统并发性...
【sys.dm_os_waiting_tasks】和【sys.dm_exec_requests】是SQL Server中用于诊断性能问题的两个重要动态管理视图(DMV)。它们都提供了关于SQL Server执行上下文等待信息的洞察,但关注的焦点有所不同。 sys.dm_...