日期:2014-05-18  浏览次数:20391 次

SQL SERVER 2008 如何锁定引起锁等待的SQL语句
碰上阻塞问题,用SQL Server 活动监视器,监测到经常会有Lock出现,影响了性能。
想请教一下,我该如何确定锁的原因和引起长时间锁定的SQL语句。

------解决方案--------------------
SQL code

一个事务未提交,导致别的事务必须等待,这就是阻塞, 
查看阻塞可以用sp_lock,打开三个查询分析器, 
第一个写: 
begin transaction tran1 
 update products set productName=productName+'A' 
 where ProductId=1 
 waitfor delay '00:00:30' 
commit transaction tran1 
第二个写: 
select * from products 
第三个写: 
sp_lock 
依次运行第一个、第二个、第三个, 
然后查看第三个分析器,看看Status列, 
看是否有Status='Wait'的行,比如我这里查看有这么一行: 
53 6 117575457 1 KEY (010086470766) S WAIT 
其中ObjId=117575457 
然后运行: 
use northwind 
select object_name(117575457) 
可以看到对应的表为 Products

------解决方案--------------------
常用的就是SQL profiler GUI进行跟踪
但是用这个跟踪对生产中的系统会产生大量额外的I/O操作
建议把
跟踪封装到存储过程 跟踪
然后对生成的trc分析
重点关注
duration列
------解决方案--------------------
探讨

SQL code

一个事务未提交,导致别的事务必须等待,这就是阻塞,
查看阻塞可以用sp_lock,打开三个查询分析器,
第一个写:
begin transaction tran1
update products set productName=productName+'A'
where ProductId=1
waitfor delay '00:00:30'
commi……

------解决方案--------------------
堵塞是正常的
死锁也是不可避免的
应尽量寻求将堵塞时间缩短最小
将死锁的发生几率降低到最小

------解决方案--------------------
探讨

引用:

写速度从300下降到30,需要查看一下下降时,执行的SQL在等待什么资源。

我现在就是想请教一下,该如何查找这个等待的资源,我用1楼得方法试过了,没发现有Status='Wait'的行