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

我们有一些Delphi代码,它使用BDE通过SQL Server Native Client ODBC驱动程序访问SQL Server 2008(2005版)。我们的问题是我们在循环中遇到一些死锁问题,这些问题是插入到多个表中的。 整个循环在[TDatabase] .StartTransaction中完成。看一下SQL Server Profiler,我们清楚地看到,在循环过程中,SPID(会话ID?)发生了变化,然后我们自然会遇到死锁。 (两个SPID对同一个表执行插入操作) 似乎BDE在某个时刻与DB的第二个连接... (虽然我很想跳过BDE,但目前还不行。) 有经验的人分享?     
已邀请:
如果您的应用程序是多线程的:BDE不是线程安全的。您必须为每个线程使用单独的BDE会话(显式创建的
TSession
实例);自动为主线程创建的全局
Session
是不够的。此外,所有数据库访问组件(
TDatabase
TQuery
等)只能在创建了相应的
TSession
实例的线程的上下文中使用。     
如果SQL Server驱动程序配置为执行连接池,请在ODBC安装中进行验证。 出现Native Client安装默认激活它...(至少,我的安装已激活连接池,我没有激活它)。     
对于提问者来说这可能为时已晚,但也许对其他人有帮助。 每当有一个未关闭的游标时,BDE / ODBC组合将为连续查询建立新连接。 “spid change”可能是非关闭游标的结果。 要解决此问题,您必须找到导致此stil-opened游标的BDE组件。然后你调用一个最终会关闭光标的方法(
TTable.Close
TTable.Last
......)。 之后,“spid change”应该消失,因此死锁。 找到该组件的一些提示: 在锁定期间,执行以下语句(例如,使用Management Studio):
EXEC sp_who2
。 查看列
BlkBy
。被阻止的连接中有一个数字。 此编号是阻塞连接的
spid
(服务器进程ID)。 然后执行
DBCC INPUTBUFFER(spid)
。 在列
EventInfo
中,您将找到程序发出的sql语句。 有了这些信息,您应该能够找到导致您麻烦的BDE组件。     

要回复问题请先登录注册