SQL server 中如何查询阻塞

转载 2017年01月03日 09:49:46

SQL server 中如何查询阻塞

详细内容请参阅:T-SQL2008技术内幕:T-SQL语言基础事务和并发


1:新建3 个查询窗口:connection1, connection2和connection3。

2:connection1中输入 :

BEGIN TRAN
    UPDATE Production.Products
    SET unitprice = unitprice + 1.00
    WHERE productid = 2

connection2中输入:

SELECT productid,unitprice
FROM Production.Products
WHERE productid = 2

connection3中输入:

SELECT
    request_session_id AS spid,
    resource_type as restype,
    resource_database_id as dbid,
    DB_NAME(resource_database_id) as dbname,
    resource_description as res,
    resource_associated_entity_id as resid,
    request_mode as mode,
    request_status as status

FROM sys.dm_tran_locks

具体信息

A:被锁定的资源类型(例如,取值之一的KEY代表索引中的行锁)

B:被锁定资源所位于的数据库ID,可以用DB_NAME函数把这个ID转换成相应的数据库名称

C:资源说明与资源相关的实体ID

D:锁模式

E:已经授予了锁,还是会话正在请求授予锁

此时,我们已经获得了阻塞链中获得进程的ID信息,如果我们想要获得其他详细信息(读取信息和二进制标志),我们好需要执行下面的语句

select
    session_id as spid,
    connect_time,
    last_read,
    last_write,
    most_recent_sql_handle
from sys.dm_exec_connections
where session_id in (61,56)  --(61,56)是阻塞进程中涉及 的ID ,你也可以根据你的实际情况编写SQL语句

具体信息

A:连接建立的时间

B:连接中最后一次发生读操作和写操作的时间

C:一个二进制标记(handle),用于代表此连接上执行的最后一个SQL批处理。可以把这个标记值作为输入参数提供给函数sys,dm_exec_sql_text,由这个函数,由这个函数

返回该标记值代表的SQL代码。


如果我们想要反过来查看批处理命令

select session_id,text
from sys.dm_exec_connections
    cross apply sys.dm_exec_sql_text(most_recent_sql_handle) as ST
    where session_id in(56,61)

以上显示了被阻塞进程(61)正在等待执行的代码,因为这是该进程最后执行的一个操作,对于阻塞进程来说,通过这个例子能够看出是那条语句导致了问题,

但是要记住,阻塞进程可能在不断运行,所以在代码中看到的最后一个操作部一定就是导致问题的语句。


对于阻塞状态中涉及到的会话,用动态管理视图sys.dm_exec_sessions也能找到很多有用的信息。

详细信息:

A:建立会话的时间(login_time),

B:特定于工作会话的客户端工作站名称(host_name)

C:初始化会话的客户端程序的名称(program_name)

D:会话所使用的SQL server登录名(login_name)

E:客户端的Windows名(nt_user_name)

F:最近一次会话请求的开始时间(last_request_start_time)

G:最近一次会话请求的完成时间(last_request_end_time)

从这些信息中可以很容易地识别出阻塞链涉及到的会话,争用的资源,被阻塞会话等待了多长时间(以毫秒为单位)等信息


设定超时期限和取消设定超时期限

最后引起事务回滚,撤销更新操作

KILL 61





一,如何监控和解决SQL Server的阻塞(1) (当前阻塞)

如何监控和解决SQL Server的阻塞(1) (当前阻塞) 1. 什么是"阻塞"? 阻塞是SQL数据库应用"锁"机制的一个副作用。当一个应用请求针对某个数据库对象(例如全表,某行数据...
  • zhengfeng2100
  • zhengfeng2100
  • 2016年09月20日 15:49
  • 3363

SQLSERVER阻塞,显示一直在查询和取消不了解决办法

在使用sqlserver时有可能碰到这样一种情况:一条挺简单的语句执行起来为什么花费时间太长,或者一直在执行,或者连取消都取消不了(排除语句本身的问题)。今天就彭代了这个问题,在查询的时候,只有几千条...
  • zr_wb
  • zr_wb
  • 2016年09月13日 15:10
  • 3809

SQL server 中如何查询阻塞

SQL server 中如何查询阻塞 详细内容请参阅:T-SQL2008技术内幕:T-SQL语言基础事务和并发 1:新建3 个查询窗口:connection1, connection2...
  • jacksonxin
  • jacksonxin
  • 2017年01月03日 09:49
  • 1519

如何监控和解决SQL Server的阻塞(1) (当前阻塞)

什么是"阻塞"?
  • hwu14
  • hwu14
  • 2014年04月11日 09:38
  • 2913

SQLServer进程阻塞的检查和解决办法

  • 2013年10月23日 15:12
  • 79KB
  • 下载

SQLServer 2008数据库查看死锁、堵塞的SQL语句

--每秒死锁数量 SELECT  * FROM    sys.dm_os_performance_counters WHERE   counter_name LIKE 'Number o...
  • saga_gallon
  • saga_gallon
  • 2016年07月21日 17:58
  • 1714

SQL Server阻塞原因与解决方法

上篇说SQL Server应用模式之OLTP系统性能分析。五种角度分析sql性能问题。本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连接在sysprocesses里字段值的组合来分析...
  • y1535623813
  • y1535623813
  • 2017年06月20日 14:09
  • 978

sql的select出现堵塞导致程序卡死的解决方法(在事务中查询)

在用C#查询sql的时候,出现很奇怪的事情,sql语句没有任何问题,但是执行到那儿之后,程序就会卡死一段时间,然后返回null,在这期间,直接在“sql server”里执行这段语句会出现无法读出的情...
  • dofun333
  • dofun333
  • 2017年11月19日 12:07
  • 360

SQLServer 检查死锁及阻塞,解决死锁及阻塞,查看数据库所有锁信息.

我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。 use...
  • a237428367
  • a237428367
  • 2013年06月01日 17:41
  • 10008

SqlServer中——查找杀死阻塞进程

查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM...
  • shuai7boy
  • shuai7boy
  • 2016年11月17日 17:23
  • 695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL server 中如何查询阻塞
举报原因:
原因补充:

(最多只允许输入30个字)