我有一个包含6列的简单表格。大多数情况下,任何插入语句都可以正常工作,但有一段时间我得到了DB Timeout异常: 超时已过期。操作完成之前经过的超时时间或服务器没有响应。声明已经终止。
超时设置为10秒。
我应该提一下,我正在使用NHibernate,并且该语句在插入本身后也包含“select SCOPE_IDENTITY()”。
我的想法是桌子被锁定了什么,但当时桌子上没有其他语句在运行。
所有插入都非常简单,在sql profiler中一切看起来都很正常,表没有索引但是PK(页面丰满度:98.57%)。
关于我应该寻找什么的任何想法?
感谢。
答案 0 :(得分:31)
我认为你最可能的罪魁祸首是来自另一个交易的阻止锁定(或者可能来自触发器或幕后的其他事件)。
最简单的方法是启动INSERT
,当它挂起时,在同一台服务器上的另一个窗口中运行EXEC SP_WHO2
。这将列出所有当前数据库活动,并有一个名为BLK
的列,它将显示当前是否阻止任何进程。检查挂起连接的SPID
,看看它是否包含BLK
列中的任何内容,如果有,那就是阻止你的过程。
即使您认为没有其他语句在运行,唯一可以确定的方法是使用类似SP的SP列出当前事务。
答案 1 :(得分:21)
这个问题似乎是一个代码片段的好地方,我曾经看过阻止和阻止查询的实际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 != ' .'
答案 2 :(得分:5)
答案 3 :(得分:4)
当时没有其他语句在该表上运行。
作为事务的一部分,针对其他表运行的语句怎么样?这可能会在问题表上留下锁定。
同时检查当时发生的日志文件或数据文件增长情况,如果您正在运行SQL2005,它将显示在SQL错误日志中。
答案 4 :(得分:3)
我们的QA有一些返回大结果集的Excel连接,这些查询在等待ASYNC_NETWORK_IO的WaitType中暂停了一段时间。在此期间,所有其他查询超时,因此特定插入与其无关。
答案 5 :(得分:0)
查看表的碎片,你可能因为那个
而得到页面拆分