背景知识:

是什么造成了阻塞?

从锁的观点来看、可访问对象前一定要对对象加锁不管你是读还是写,如果用户A以经持有对象,说明A以在对象上加锁,如果这时B

也想访问这个对象、它也要对对象加锁。重点来了如果A用户加的是排它锁,B用户可以做的就是乖乖等A用完再说。B乖乖等这个问题

就是阻塞,是因为这两把锁不可以共存才造成了阻塞。

场景再现:

为在再现场景我们要开三个通向数据的连接。就是说要打开三个managerment studio 或是开三个sqlcmd。我用ssms(SQL Server Managerment Studio)为例

先为场景做点准备,代码如下。

use Studio;
            go

create table TestTable (ID int not null,String nchar(10));
            go

declare @i as int =1;
            while @i<10
            begin
            insert into TestTable(ID,String) values(@i,REPLICATE(cast(@i as nchar(1)),10));
            set @i = @i +1;
            end;
            go

select T.ID,T.String from TestTable as T;

go

连接A运行如下代码:

begin tran
                                    update dbo.TestTable
                                    set String = 'AAA'
                                    where ID=1;
                                    go --可以看到A会一直持有第一行上的排它锁,直到事务被commit 或 rollback!

连接B运行如下代码:

update dbo.TestTable
                                    set String = 'BBB'
                                    where ID=1;

go -- 因A以在ID=1这一行上有排它锁,所以B只可以乖乖的等,这就造成了阻塞。下图可以看出B等了2分多钟了。

C连接用来解除阻塞,运行代码马上就讲。

方法 1、 从锁入手

第一步、看谁在等待资源,以确定谁被阻塞、运行如下代码

select
                                 tra.request_session_id as [SessionID],-- 会话名
                                 DB_NAME(tra.resource_database_id) as [DBName],-- 数据库名
                                 tra.resource_type as [resourceType],-- 资源类型
                                 tra.resource_associated_entity_id as [ResourceID],--资源ID
                                 tra.request_status as [Status]  --状态
                                 from sys.dm_tran_locks as tra
                                 where tra.request_session_id>50;
                                 go

-- 下图中可以看出有一行是wait 说明它在等别人,释放资源。

所以 54 是在等别人,它等谁呢?从图上可以看出 51 持有54在等待对象的排它锁,说明54在等51。

第二步、定位等的是哪个资源:

运行如下代码

select OBJECT_NAME(565577053);--565577053来自于图上的倒数第二行。
                                                           go

第三步、查看因为什么操作造成阻塞:

到目前为止,sys.dm_tran_locks只能帮我们到这里下,我们需要新的武器

sys.dm_exec_connections

select

con.session_id as [SessionID],

con.connect_time as[ConnectTime],

con.most_recent_sql_handle as [SqlHandle]

from sys.dm_exec_connections as con

where session_id in (51,54);

go

most_recent_sql_handle 返回连接最后执行SQL语句的指针,注意它不一定就是移动存造成阻塞的原因,它只是最后执行

的SQL语句。

要看代码这就要用到我们的第三件武器了 sys.dm_exec_sql_text(  )函数

select

con.session_id as [SessionID],

sqlt.text

from sys.dm_exec_connections as con cross apply sys.dm_exec_sql_text(con.most_recent_sql_handle) as sqlt

where session_id in (51,54);

go

第四步:

解除阻塞,经过上面的三步阻塞的原因基本上以有所了解了。

我们只要把长期占着资源的连接kill(杀死)掉就行了,本例中,是51号连接长占资源不放,所以要kill它。

kill 51;

go

方法 2、

下面我们从任务(task)的角度来看问题、阻塞也就是一个任务在等待另一个任务的执行完成,只要找到它在等谁,再把引起等待的任务kill、当然

任务是不可以kill的,但是我们不是可以曲线救国吗?kill掉它的连接啊,对吧。

第一步:

找到引起阻塞的进程ID

select
                 task.session_id,
                 task.wait_duration_ms,task.
                 blocking_session_id
                 from sys.dm_os_waiting_tasks as task
                 where task.blocking_session_id is not null;
                 go

-- 方法1时我以把阻塞排除,下图是一个新的阻塞,所以session_ID上会不一样。

第二步:

接下来就是用

sys.dm_exec_connections, sys.dm_exec_sql_text,kill来排除阻塞了,用法如方法1中所说。

第三步:

kill 52;

SQL Server 阻塞排除的 2 方法的更多相关文章

  1. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  2. sql server 阻塞与锁

    SQL Server阻塞与锁 在讨论阻塞与加锁之前,需要先理解一些核心概念:并发性.事务.隔离级别.阻塞锁及死锁. 并发性是指多个进程在相同时间访问或者更改共享数据的能力.一般情况而言,一个系统在互不 ...

  3. Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ...

  4. 最简单删除SQL Server中所有数据的方法

     最简单删除SQL Server中所有数据的方法 编写人:CC阿爸 2014-3-14 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间 ...

  5. SQL Server日志文件庞大收缩方法(实测好用)

    原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...

  6. SQL Server 性能优化之——系统化方法提高性能

    SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...

  7. SQL server分页的四种方法

    SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路  先取前20页, ...

  8. SQL Server 阻塞分析

    一.加锁(locking).阻塞(blocking).死锁(deadlock)定义        加锁:用于管理多个连接的进程.当连接需要访问一块数据时,在这些数据上放置某种类型的锁.      阻塞 ...

  9. Sql Server 阻塞的常见原因和解决办法

    1. 由于语句运行时间太长而导致的阻塞,语句本身在正常运行中,只须等待某些系统资源 解决办法: a. 语句本身有没有可优化的空间 b. Sql Server 整体性能如何,是不是有资源瓶颈影响了语句执 ...

随机推荐

  1. PHP判断访客是否移动端浏览器访问

    今天要给大家分享一段PHP代码,该代码的功能是用来判断访客是否移动端浏览器访问,该功能的实现思路是通过HTTP_X_WAP_PROFILE. HTTP_VIA.HTTP_USER_AGENT等信息来判 ...

  2. python笔记之中缀语法和管道实现

    python笔记之中缀语法和管道实现 你知道什么是中缀语法吗?你知道python中的中缀操作是什么吗?那你知道操作python也是可以像unix的管道符一样方便吗?那么,废话不说了,直接上代码. cl ...

  3. 使用ARM模板部署自动扩展的Linux VMSS(1)

    在Azure之前的ASM版本或者经典模式中,用户使用Azure Website,Azure Cloud Service等PAAS服务,可以实现一定程度上的自动扩展(auto scaling),但有着诸 ...

  4. Qt中调用PolarSSL库(一)

    最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...

  5. 并行编译加快VS C++项目的编译速度

    最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...

  6. 经典递归算法研究:hanoi塔的理解与实现

    关于hanoi塔的原理以及概念,请Google,访问不了去百度. 主要设计到C中程序设计中递归的实现: 主代码实现如下: void hanoi(int src, int dest, int tmp, ...

  7. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1

    /** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...

  8. PHP 表单验证 - 完成表单实例

    ------------------------------------------------------------------------------------------- 本节展示如何在用 ...

  9. Unity 编辑器扩展自定义窗体

    这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using Un ...

  10. Unity 鼠标点击左右移动,人物跟随旋转

    上代码: using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private Vector ...