【发布时间】:2013-02-13 18:20:22
【问题描述】:
我们目前在 SQL Server 2000 上运行一个数据库。该数据库不断地从平面文件中导入数据以供以后查询。此过程由一系列 SQL Server 存储过程完成,并通过 xp_cmdshell 从这些过程中调用 BCP。这些脚本使用BCP 将平面文件读入同一服务器上辅助数据库中的持久表中。然后脚本会从导入的数据库表中拉取数据,并将其放入经过规范化的真实数据库中,用于查询。
通常,此导入过程需要 5-10 分钟,具体取决于文件的大小。然而,在过去的一周里,它已经花费了 50-60 分钟。我们已尝试逐步完成这些程序。我们注意到,一旦我们创建了一个临时表,我们就无法从另一个查询窗口查询tempdb。但更重要的是,什么时候可以逐步完成,直到我们截断第一个导入表。我们允许 truncate 执行,然后当我们使用 sp_lock 检查数据库中的锁时,我们看到 truncate 占用的锁没有被释放。然后我们允许对BCP 的xp_cmdshell 调用执行,它将坐在那里。我们查看 CPU 和 I/O 并发现当过程卡在调用 BCP 时没有明显的活动。当我们尝试这个时,也没有其他已知的查询正在运行。请注意,文件本身很小;最多 20 行。
如果我们从单独的查询中运行带有xp_cmdshell 的bcp 命令,它将正常工作,但如果我们已执行截断行但尚未执行存储过程中的BCP 行,则会锁定。
所以我们的问题是为什么服务器会进入这种死锁状态,更重要的是为什么 truncate 生成的锁不会释放?
【问题讨论】:
标签: sql-server stored-procedures sql-server-2000 bcp database-deadlocks