2010-03-24 47 views
3

我們有一些使用BDE通過SQL Server本機客戶端ODBC驅動程序(2005版)訪問SQL Server 2008的Delphi代碼。我們的問題是我們在循環插入多個表時遇到了一些死鎖問題。BDE,Delphi,ODBC,SQL本機客戶端和死鎖

整個循環在[TDatabase] .StartTransaction中完成。看看SQL Server Profiler,我們清楚地看到,在循環過程中的某一點,SPID(會話ID?)發生了變化,然後我們自然而然地陷入了僵局。 (兩個SPID執行插入到相同的表)

好像在某些時候確實BDE向DB第二連接...

(雖然我很想跳過BDE,它目前不可能)

任何有經驗的人都可以分享?

+0

爲什麼你沒有使用ADO? – 2010-03-24 10:14:02

+0

因爲代碼庫大約13歲,並且嚴重依賴於BDE。此外,我們需要支持Interbase和MSSQL。 – EspenS 2010-03-24 13:49:19

+0

當你說「spid變更」時,我有點困惑。這也許是一個死鎖的原因..你不能在一個SPID啓動一個事務,並嘗試做插入在不同的一個或一個不同結束交易。你知道你如何結束兩個spids?你不是多線程,那麼你是否創建了第二個數據庫連接? – 2010-03-25 12:41:34

回答

1

如果您的應用程序是多線程的:BDE不是線程安全的。您必須爲每個線程使用單獨的BDE會話(明確創建的TSession實例);自動爲主線程創建的全局Session是不夠的。此外,所有數據庫訪問組件(TDatabase,TQuery等)只能用於創建其相應的TSession實例的線程上下文中。

+0

該應用程序不是多線程的。 – EspenS 2010-03-24 13:46:17

1

在ODBC安裝中驗證SQL Server驅動程序是否配置爲執行連接池。 似乎Native Client安裝默認激活它(至少,我的安裝連接池已激活,我沒有激活它)。

0

這對提問者來說可能來得太晚,但也許它對別人有幫助。

每當有一個遊標未關閉時,BDE/ODBC組合將爲連續查詢建立一個新的連接。 「spid change」可能是非關閉遊標的結果。

要解決此問題,您必須找到導致此stil打開遊標的BDE組件。然後你調用一個最終關閉遊標的方法(TTable.Close,TTable.Last ...)。

之後,「spid change」應該消失,因此死鎖。

一些提示,以找到該組件:

  • 在鎖,執行以下語句(例如使用Management Studio): EXEC sp_who2
  • 請看第BlkBy列。被阻止的連接有一個數字。
  • 此編號是阻止連接的spid(服務器進程ID)。您可以執行DBCC INPUTBUFFER(spid)
  • 在第EventInfo列中,您會發現程序已經發出的sql語句。
  • 有了這些信息,你應該能夠找到導致你的麻煩的BDE組件。