我有一个简单的表,有6列.大多数情况下,任何插入语句都可以正常工作,但有一段时间我得到一个DB Timeout异常:Timeout过期了.操作完成之前经过的超时时间或服务器没有响应.该语句已终止.
超时设置为10秒.
我应该提一下,我正在使用NHibernate,并且该语句在插入本身之后也包含"select SCOPE_IDENTITY()".
我的想法是桌子被锁定了什么,但当时桌子上没有其他语句在运行.
所有插入都非常简单,在sql profiler中一切看起来都很正常,表没有索引但是PK(页面丰满度:98.57%).
关于我应该寻找什么的任何想法?
谢谢.
我认为你最可能的罪魁祸首是来自另一个交易的阻止锁定(或者可能来自触发器或幕后的其他事件).
最简单的方法是启动INSERT
它,当它挂起时,EXEC SP_WHO2
在同一台服务器上的另一个窗口中运行.这将列出所有当前数据库活动,并且有一个调用列BLK
,将显示当前是否阻止任何进程.检查SPID
你的挂起连接是否在BLK
列中有任何内容,如果有,那就是阻止你的进程.
即使您认为没有其他语句在运行,唯一可以确定的方法是使用类似SP的SP列出当前事务.
这个问题似乎是一个代码片段的好地方,我曾经看到过阻塞和阻塞查询的实际SQL文本.
下面的代码片段使用SP_WHO2
返回"." 的约定.BlockedBy
非阻塞查询的文本,因此它将它们过滤掉并返回剩余查询的SQL文本("受害者"和"罪魁祸首"):
--prepare a table so that we can filter out sp_who2 results DECLARE @who TABLE(BlockedId INT, Status VARCHAR(MAX), LOGIN VARCHAR(MAX), HostName VARCHAR(MAX), BlockedById VARCHAR(MAX), DBName VARCHAR(MAX), Command VARCHAR(MAX), CPUTime INT, DiskIO INT, LastBatch VARCHAR(MAX), ProgramName VARCHAR(MAX), SPID_1 INT, REQUESTID INT) INSERT INTO @who EXEC sp_who2 --select the blocked and blocking queries (if any) as SQL text SELECT ( SELECT TEXT FROM sys.dm_exec_sql_text( (SELECT handle FROM ( SELECT CAST(sql_handle AS VARBINARY(128)) AS handle FROM sys.sysprocesses WHERE spid = BlockedId ) query) ) ) AS 'Blocked Query (Victim)', ( SELECT TEXT FROM sys.dm_exec_sql_text( (SELECT handle FROM ( SELECT CAST(sql_handle AS VARBINARY(128)) AS handle FROM sys.sysprocesses WHERE spid = BlockedById ) query) ) ) AS 'Blocking Query (Culprit)' FROM @who WHERE BlockedById != ' .'
可能是桌子需要很长时间才能成长.
如果您将表设置为大量增长,并且未启用即时文件初始化,则查询肯定会偶尔超时.
检查一下这个烂摊子:MSDN