模拟阻塞:
打开两个窗口:
    窗口一:
 BEGIN TRANSACTION--开始事务
update tblUser set [Password] = '' where id = 1
--等待1分钟
WAITFOR DELAY '00:1';

 窗口二:

 select * from tblUser where id = 1

查询阻塞:(当前被阻塞的进程id,不一定是它阻塞其他进程,有可能是它被其他进程阻塞)

 select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'

查看阻塞的语句:(根据上面查询出来的阻塞进程id)

 DBCC INPUTBUFFER (54)

杀死死锁进程:(根据上面查询出来的阻塞进程id)

 kill 55
知识点:WAITFOR DELAY
    WAITFOR是SQL Server中Transact-SQL提供的一个流程控制语句。它的作用就是等待特定时间,然后继续执行后续的语句。它包含一个参数DELAY,用来指定等待的时间。
    WAITFOR DELAY '0:0:4'--  表示延迟4秒,再继续执行。
 

进化版一:

查阻塞进程,及是谁在阻塞,还有阻塞的表:
 select t1.spid as '等待的进程id',
OBJECT_NAME(t2.resource_associated_entity_id) as '等待进程-表' ,
t1.blocked as '阻塞的进程id',
OBJECT_NAME(t3.resource_associated_entity_id) as '阻塞进程-表',
tt1.hostname as '阻塞进程-hostname',
tt1.nt_domain as '阻塞进程-nt_domain',
tt1.nt_username as '阻塞进程-nt_username',
tt1.loginame as '阻塞进程-loginame'
from (
select 0 as spid ,blocked
from (
select * from master..sysprocesses where blocked > 0
) a
where not exists (
select * from (select * from master..sysprocesses where blocked > 0 ) b
where a.blocked=spid
)
union
select spid,blocked from master..sysprocesses where blocked > 0
) t1
inner join master..sysprocesses tt1 on t1.blocked = tt1.spid
left join sys.dm_tran_locks t2 on t1.spid = t2.request_session_id and t2.resource_type = 'OBJECT'
left join sys.dm_tran_locks t3 on t1.blocked = t3.request_session_id and t3.resource_type = 'OBJECT'

进化版二:(最实用,上面的精简版)

查阻塞数据库的进程id,把这些进程kill掉就可以了;
 select t1.blocked as '阻塞的进程id',
OBJECT_NAME(t2.resource_associated_entity_id) as '阻塞的表',
t3.hostname as '阻塞进程-hostname',
t3.nt_domain as '阻塞进程-nt_domain',
t3.nt_username as '阻塞进程-nt_username',
t3.loginame as '阻塞进程-loginame'
from master..sysprocesses t1
inner join sys.dm_tran_locks t2 on t1.blocked = t2.request_session_id and t2.resource_type = 'OBJECT'
inner join master..sysprocesses t3 on t1.blocked = t3.spid
where t1.blocked > 0

进化版三:(信息最全)

查看等待的进程、阻塞的进程执行的语句,账号,地址等信息;
 SELECT
WT.session_id AS '等待的进程',
DB_NAME(TL.resource_database_id) AS '数据库名',
(select OBJECT_NAME(resource_associated_entity_id) --resource_associated_entity_id为Bigint类型,而Object_Name方法参数为int,有可能出现转换失败的情况
from sys.dm_tran_locks
where request_session_id = WT.blocking_session_id
and resource_type = 'OBJECT') as '表名',
WT.wait_duration_ms,
TL.request_mode,
(SELECT SUBSTRING(ST.text, (ER.statement_start_offset/2) + 1,
((CASE ER.statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE ER.statement_end_offset
END - ER.statement_start_offset)/2) + 1)
FROM sys.dm_exec_requests AS ER
CROSS APPLY sys.dm_exec_sql_text(ER.sql_handle) AS ST
WHERE ER.session_id = TL.request_session_id)
AS '等待执行的sql',
WT.blocking_session_id as '阻塞的进程',
WT.resource_description AS blocking_resource_description,
CASE WHEN WT.blocking_session_id > 0 THEN
(SELECT ST2.text FROM sys.sysprocesses AS SP
CROSS APPLY sys.dm_exec_sql_text(SP.sql_handle) AS ST2
WHERE SP.spid = WT.blocking_session_id)
ELSE NULL
END AS '阻塞进程执行的sql',
SPP.hostname as '阻塞进程-hostname',
SPP.nt_domain as '阻塞进程-nt_domain',
SPP.nt_username as '阻塞进程-nt_username',
SPP.loginame as '阻塞进程-loginame'
FROM sys.dm_os_waiting_tasks AS WT
JOIN sys.dm_tran_locks AS TL
ON WT.resource_address = TL.lock_owner_address
inner join sys.sysprocesses as SPP on WT.blocking_session_id = SPP.spid
WHERE WT.wait_duration_ms > 5000--等待5s以上的
AND WT.session_id > 50;

进化版四:

    一、查看阻塞进程及语句:exec sp_who_lock(在master数据库下)
    二、解决阻塞:exec p_killspid 'DBName'(在master数据库下)
 
创建存储过程,查当前阻塞:
 USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 2018/4/14 22:26:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[sp_who_lock]
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint) IF @@ERROR<>0 RETURN @@ERROR insert into #tmp_lock_who(spid,bl) select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0 IF @@ERROR<>0 RETURN @@ERROR -- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who IF @@ERROR<>0 RETURN @@ERROR if @intCountProperties=0
select '现在没有阻塞和死锁信息' as message -- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
begin
if @spid =0
select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
else
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
end -- 循环指针下移
set @intCounter = @intCounter + 1
end drop table #tmp_lock_who return 0
end

创建存储过程,解除阻塞:

 USE [master]
GO
/****** Object: StoredProcedure [dbo].[p_killspid] Script Date: 2018/4/14 22:18:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO create proc [dbo].[p_killspid]
@dbname varchar(200) --要关闭进程的数据库名
as
declare @sql nvarchar(500)
declare @spid nvarchar(20) declare #tb cursor for
--select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) --杀所有当前阻塞在数据库中的进程
select spid=cast(blocked as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) and blocked > 0 --只杀阻塞其他进程的进程
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #tb into @spid
end
close #tb
deallocate #tb

参考:

https://blog.csdn.net/snowfoxmonitor/article/details/7182948

https://blog.csdn.net/wulex/article/details/61916478

https://blog.csdn.net/zouxistudent/article/details/7029759

https://blog.csdn.net/a237428367/article/details/9004802

https://www.cnblogs.com/fuyuanming/p/5783421.html

sqlserver-查阻塞的更多相关文章

  1. SQLSERVER——查看阻塞信息(sp_who_lock优化无误版)

    经常会需要分析SQLSERVER的阻塞情况,尤其是某些SQL操作异常缓慢从而怀疑是有人在搞事情的情况下.网上有许多一模一样的帖子,是关于sp_who_lock这个存储过程的,然而,网上流传的这个是略有 ...

  2. sqlserver监控阻塞(死锁)具体情况

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

  3. sqlserver监控阻塞(死锁)具体情况(转)

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

  4. sqlserver 数据库阻塞和死锁

    参考原文:http://blog.csdn.net/ha196200/article/details/44985597 (1) 数据库阻塞: 假设第一个连接T1占有且没有释放资源,第二个连接T2请求同 ...

  5. 63. sqlserver查版本号问题

    SELECT @@VERSION as 版本详细情况 SELECT SERVERPROPERTY('edition') as 软件版本 SELECT SERVERPROPERTY('ProductVe ...

  6. 分享个昨天学的,sqlserver查表的所有列的列名,类型,长度的sql

     select a.name as 列名, a.length as 长度,b.name as 类型 from syscolumns a left join systypes b on a.xtype  ...

  7. With(ReadPast)就不会被阻塞吗?

    在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”. 可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞? ...

  8. Sqlserver中关于锁

    大多数数据库需要同时处理多个查询,这些查询并不会像车等待红绿灯排队等待,而是会寻找最短的路径执行,因此需要一个红绿灯进行约束,这个红绿灯就是锁 理论上所有的事务之间应该是完全隔离的,但是事实上隔离的成 ...

  9. 2019-04-29 EasyWeb下配置Atomikos+SQLServer分布式数据源

    初次尝试: 配置Mysql时候使用的是Atomikos+DruidXADataSource,所以觉得配置SQLServer应该也是仅仅配置配置就够了,于是引入JDBC驱动依赖后,配置了文件 sprin ...

随机推荐

  1. XIB

    Xib加载的几种方法 - 简书 一天一点xib_10说说原理.优化方面的东西吧 - 简书 自定义View的封装和xib文件的使用详解|xiaoyou's blog 纯代码封装自定义View和XIB封装 ...

  2. 线程队列-queue

    使用队列的目的: 解耦,使程序之间实现松耦合:提高处理效率   FIFO = 先进先出,first in first out LIFO = 后入先出,last in first out   生产者消费 ...

  3. angular路由传参和获取路由参数的方法

    1.首先是需要导入的模块 import { Router } from "@angular/router";//路由传参用到 import{ActivatedRoute,Param ...

  4. 如何创建一个新的vue项目

    一.cnpm安装 1.百度node官网,进入官网下载安装包安装好node环境 2.成功后打开cmd命令行工具,执行node-v命令,查看node版本号,如果能输出版本号说明安装成功 3.推荐使用淘宝 ...

  5. 前端用node+mysql实现简单服务端

    node express + mysql实现简单服务端前端新人想写服务端不想学PHP等后端语言怎么办,那就用js写后台吧!这也是我这个前端新人的学习成果分享,如有那些地方不对,请给我指出. 1.准备工 ...

  6. php向页面输出中文时出现乱码的解决方法

    今天,刚刚学习PHP发现用echo输出中文时,页面会出现乱码,然后查了一下资料说是浏览器编码格式有问题,要改成utf-8.但是每个人的浏览器编码可能会有所不同,所以找到了一个很好的解决方法, 就是在p ...

  7. 如何从SAP ECC中抽取簇表数据

    打开SAP 客户端工具 ABAP 中 创建包(SE80) 创建函数组 展开ABAP 工作台,双击ABAP Dictionary 字典: 选择第三个data type,输入数据结构名称ZSQL_CLAU ...

  8. Python学习 :网络通信要素

    网络通信 OSI 模型 - 定义了计算机互联的标准,是设计和描述计算机网络通信的基本框架 - 把网络通信的工作分为7层,分别是物理层.链路层(数据网络层).网络层.传输层.会话层.表示层和应用层 网络 ...

  9. MongoDB固定集合(capped collection)

    一 . 什么是固定集合 MongoDB中有一种特殊类型的集合,值得我们特别留意,那就是固定集合(capped collection). 固定集合可以声明collection的容量大小,其行为类似于循环 ...

  10. 基于STM32F103ZET6 HC_SR501人体红外感应

    这是最后的实验现象,有人走过会一直输出有人,离开范围时则输出没人 开发板 PZ6086L ,HC_SR501模块 这是HC_SR501的示意图,,VCC和GND不再多做介绍,5V供电就行, OUT接口 ...