0

我們當前正在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_cmdshellbcp命令它會正常工作,但如果我們執行了截斷線,但鎖起來還不是BCP線在存儲過程中。

所以我們的問題是爲什麼服務器進入這個死鎖狀態,更重要的是爲什麼截斷不會釋放鎖?

回答

0

只有在存在活動事務時纔會保留SQL Server中的鎖定。在調用外部BCP之前,您必須提交事務。否則,你會遇到這個僵局。

順便提一下,SQL Server無法檢測到此死鎖,所以如果發生這種情況,您將永遠陷入其中。