0

我们目前在 SQL Server 2000 上运行一个数据库。该数据库不断地从平面文件中导入数据以供以后查询。此过程由一系列 SQL Server 存储过程完成,并BCP通过xp_cmdshell. 脚本用于BCP将平面文件读入同一服务器上辅助数据库中的持久表中。然后脚本将从导入数据库表中提取数据并将其放入经过规范化并用于查询的真实数据库中。

通常,此导入过程需要 5-10 分钟,具体取决于文件的大小。然而,在过去的一周里,它已经花费了 50-60 分钟。我们已尝试逐步完成这些程序。我们注意到,一旦我们创建了一个临时表,我们就无法tempdb从另一个查询窗口进行查询。但更重要的是,什么时候可以逐步完成,直到我们截断第一个导入表。我们允许 truncate 执行,然后当我们使用 检查数据库中的锁时sp_lock,我们看到 truncate 获取的锁没有被释放。然后我们允许xp_cmdshell调用BCP执行,它将坐在那里。我们查看 CPU 和 I/O 并发现当过程卡在调用 BCP 时没有明显的活动。当我们尝试这个时,也没有其他已知的查询正在运行。请注意,文件本身很小;最多20行。

如果我们从单独的查询中运行bcp命令,xp_cmdshell它会正常工作,但如果我们已经执行了截断行但尚未执行BCP存储过程中的行,则会锁定。

所以我们的问题是为什么服务器会进入这种死锁状态,更重要的是为什么 truncate 生成的锁不会释放?

4

1 回答 1

0

SQL Server 中的锁仅在存在活动事务时才被持有。您必须在调用外部 BCP 之前提交事务。否则你会遇到这个死锁。

顺便说一句,SQL Server 无法检测到这种死锁,所以如果发生这种情况,您将永远陷入困境。

于 2013-02-13T19:19:18.240 回答