BDE,Delphi,ODBC,SQL Native Client&死锁

时间:2010-03-24 09:02:28

标签: delphi odbc deadlock bde sql-server-native-client

我们有一些Delphi代码通过SQL Server Native Client ODBC驱动程序(2005版)使用BDE访问SQL Server 2008。我们的问题是我们在循环中遇到一些死锁问题,这些问题是插入到多个表中的。

整个循环在[TDatabase] .StartTransaction中完成。看一下SQL Server Profiler,我们清楚地看到,在循环过程中,SPID(会话ID?)发生了变化,然后我们自然会遇到死锁。 (两个SPID都对同一个表执行插入操作)

似乎BDE在某个时刻与DB的第二次连接...

(虽然我很想跳过BDE,但目前还不行。)

有经验的人分享?

3 个答案:

答案 0 :(得分:1)

如果您的应用是多线程的:BDE不是线程安全的。您必须为每个线程使用单独的BDE会话(显式创建TSession的实例);为主线程自动创建的全局Session是不够的。此外,所有数据库访问组件(TDatabaseTQuery等)只能在创建了TSession对应实例的线程的上下文中使用。

答案 1 :(得分:1)

在ODBC安装中验证SQL Server驱动程序是否配置为执行连接池。 出现Native Client安装默认激活它...(至少,我的安装已激活连接池,我没有激活它。)

答案 2 :(得分:0)

对于提问者来说这可能为时已晚,但也许对其他人有帮助。

每次有一个没有关闭的游标时,BDE / ODBC组合将为连续的查询建立一个新的连接。 " spid change"可能是非关闭游标的结果。

要解决此问题,您必须找到导致此stil-opened游标的BDE组件。然后你调用一个最终会关闭光标的方法(TTable.CloseTTable.Last ...)。

之后" spid改变"应该消失,因此陷入僵局。

找到该组件的一些提示:

  • 在锁定期间,执行以下语句(例如,使用Management Studio): EXEC sp_who2
  • 查看专栏BlkBy。被阻止的连接中有一个数字。
  • 此数字是阻止连接的spid(服务器进程ID)。
  • 然后执行DBCC INPUTBUFFER(spid)
  • EventInfo列中,您将找到程序发出的sql语句。
  • 使用该信息,您应该能够找到导致您麻烦的BDE组件。