3

BDE を使用して、SQL Server Native Client ODBC ドライバー (2005 バージョン) を介して SQL Server 2008 にアクセスする Delphi コードがいくつかあります。私たちの問題は、複数のテーブルへの挿入を行うループでデッドロックの問題が発生していることです。

ループ全体が [TDatabase].StartTransaction 内で実行されます。SQL Server プロファイラーを見ると、ループ中のある時点で SPID (セッション ID?) が変更され、自然にデッドロックが発生することがはっきりとわかります。(両方の SPID が同じテーブルに挿入します)

ある時点でBDEがDBへの2番目の接続を行うようです...

(BDE をスキップしたいのですが、現在はできません。)

共有する経験がある人はいますか?

4

3 に答える 3

1

SQL Server ドライバーが接続プールを実行するように構成されているかどうか、ODBC インストールで確認します。Native Clientのインストールにより、デフォルトでアクティブ化されているように見えます...(少なくとも、私のインストールでは接続プールがアクティブになっていて、アクティブ化していません)。

于 2010-07-22T17:48:19.957 に答える
1

アプリがマルチスレッドの場合: BDE はスレッドセーフではありません。TSessionスレッドごとに個別の BDE セッション (明示的に作成された のインスタンス) を使用する必要があります。メイン スレッド用に自動的に作成されたグローバルSessionでは不十分です。また、すべてのデータベース アクセス コンポーネント ( TDatabaseTQueryなど) は、対応する のインスタンスTSessionが作成されたスレッドのコンテキストでのみ使用できます。

于 2010-03-24T10:38:28.870 に答える