SQL Server 2000截断死锁
问题描述:
我们当前正在SQL Server 2000上运行数据库。数据库不断从平面文件导入数据以供以后查询。此过程由一系列SQL Server存储过程完成,并通过xp_cmdshell
从这些过程调用BCP
。这些脚本使用BCP
将平面文件读入同一台服务器上辅助数据库中的永久表中。然后这些脚本将从导入数据库表中提取数据并将其放入正常化并用于查询的实际数据库中。SQL Server 2000截断死锁
正常情况下,根据文件的大小,此导入过程需要5-10分钟。然而过去一周它已经花费了50-60分钟。我们已经尝试加强程序。我们注意到,只要我们创建临时表,我们就无法从另一个查询窗口查询tempdb
。但更重要的是,当我们截断第一个导入表时,可以一步步完成。我们允许截断执行,然后当我们使用sp_lock
检查数据库中的锁时,我们看到truncate截取的锁不会被释放。然后,我们允许xp_cmdshell
调用BCP
执行,它会坐在那里。我们看着CPU和I/O,当程序卡住BCP时看不到任何重要的活动。当我们尝试这些时,也没有其他已知的查询正在运行。请注意,文件本身很小,最多20行。
如果我们从一个单独的查询运行与xp_cmdshell
的bcp
命令它会正常工作,但如果我们执行了截断线,但锁起来还不是BCP
线在存储过程中。
所以我们的问题是为什么服务器进入这个死锁状态,更重要的是为什么截断不会释放锁?
答
只有在存在活动事务时才会保留SQL Server中的锁定。在调用外部BCP之前,您必须提交事务。否则,你会遇到这个僵局。
顺便提一下,SQL Server无法检测到此死锁,所以如果发生这种情况,您将永远陷入其中。