3

NHibernateをデータ アクセス レイヤーとして使用し、SQL Server コンパクトを使用して、ac# デスクトップ アプリケーションに取り組んでい ます。アプリケーションは複数のスレッドを使用して、データの選択と更新を実行します。

通常は正常に動作していますが、デッドロック状態が発生することがあります。

15:28:16,750 55 警告: System.Data.SqlServerCe.SqlCeLockTimeoutException (0x80004005): タイムアウト ..... [ セッション ID = 28、スレッド ID = 14576、プロセス ID = 12960、テーブル名 = PatientOrder、競合タイプ = xロック (x ブロック)、リソース = PAG (idx): 1035]

2 つのトランザクションが同じ行を更新しようとすると、デッドロックの問題を理解できます。ただし、この場合、両方のトランザクションが異なる行で動作しています。デッドロックは、インデックス ( ) のページ ロックResource = PAG (idx): 1035が原因のようです。

だから私の質問は、これらのデッドロックを防ぐために何ができるでしょうか?

私はすでに次のオプションを調べました:

  • インデックスのページ ロックを無効にします。これは「フル」SQL サーバーでは可能ですが、コンパクト エディションではサポートされていないようです。

  • with(rowlock)(うまくいけば)問題を防ぐSQLステートメントを生成するようにhibernateを構成します

  • session.lock(...)すべてのトランザクションに対して同じ順序でリソース アクセスを強制するために使用しようとしています。ただし、デッドロックのトランザクションが別の行で動作しているため、これは役に立たないようです。

  • 一度に 1 つだけがアクティブになるように、すべてのデータベース トランザクションをシリアル化します。これは機能しますが、パフォーマンスに大きな影響を与えます。

4

1 に答える 1

0

@Wolfgang ISessionをどのように管理していますか? ISession はスレッドセーフではありません。単一のインスタンスを使用していて、スレッド間で共有している場合、これが問題になるはずです。IoC を使用している場合は、ISession のスコープを確認し、スレッドごとに 1 つ変更します。

于 2013-07-17T21:52:29.177 に答える