日期:2014-05-17  浏览次数:20723 次

sqlserver表打不开是死锁吗?
请教一下,数据库中有一个表无法执行查询了,这是死锁吗?那个表的数据量不多,也就1千行左右,执行select语句时,一直显示正在查询,然后把数据库分离后,再附加,就能查询了。其他的表能查询。这是死锁吗?
现在正是服务器大概一星期出现一两次,测试服务器从没出现过这情况。每天晚上会从另一个系统的数据库中查一些数据过来并插入到本系统的数据中来,但是正式服务器却偶尔出现这情况,测试服务器从没出现过。请大侠指教!谢谢

------解决方案--------------------

--检索死锁进程
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name  
from sys.sysprocesses  
where spid in
( select blocked from sys.sysprocesses where blocked <> 0 ) or (blocked <>0)

--为了防止死锁,在可接受范围内,试试with (nolock)选项
select * from dbo.t with (nolock)

------解决方案--------------------
估计是执行了begin tran后,执行update操作,结果是没有成功,也没有rollback tran
导致死锁。

你认真检验一下代码,有没有错误处理,判断错误处理为if @@Error<>0
------解决方案--------------------
引用:
估计是执行了begin tran后,执行update操作,结果是没有成功,也没有rollback tran
导致死锁。

你认真检验一下代码,有没有错误处理,判断错误处理为if @@Error<>0


我就这样整,每次做delete时候,先begin tran,模仿oracle的手动提交,以免出错
------解决方案--------------------
100%不是死锁,但有可能是阻塞。
------解决方案--------------------
死锁不是这个样子的,是阻塞。sp_who看看是否有BLOCK
------解决方案--------------------
查询加上Nolock
如select *from 表(nolock)
这样不用等其他的事务提交就可以读了。
------解决方案--------------------
阻塞只能尽量减少,可以修改地隔离级别比如NOLOCK,使用索引,可以读写分离,减小事物,使用乐观隔离级别(SNAPSHOT)等等。 
------解决方案--------------------
看一下又等待吗?可能是等待资源
------解决方案--------------------
引用:
刚又出现这情况了,我用sp_who看了,没有block,而是suspended,这是阻塞吗?

你用sp_who看到suspended就表面有可能发生了阻塞,
这个时候你再运行一下 sp_lock ,看看status有没有wait的?
------解决方案--------------------