6

INSERT と UPDATE を行うストアド プロシージャを (.NET アプリケーションから) 実行すると、ときどき (実際にはそれほど頻繁ではありません)、ランダムに次のエラーが発生します。

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server] サーバー コマンド (ファミリ ID #0、プロセス ID #46) でデッドロック状態が発生しました。コマンドを再実行してください。

どうすればこれを修正できますか?

ありがとう。

4

3 に答える 3

8

デッドロックの問題を解決するための最善の策は、「デッドロック情報の印刷」を使用時に設定することです。

sp_configure "デッドロック情報の印刷"、1

デッドロックが発生するたびに、関与したプロセスと、デッドロック時に実行されていたSQLに関する情報が出力されます。

テーブルが全ページロックを使用している場合。データ行またはデータページのロックに切り替えるためのデッドロックを減らすことができます。これを行う場合は、必ずテーブルの新しい統計を収集し、変更されたテーブルにアクセスするインデックス、ビュー、ストアドプロシージャ、およびトリガーを再作成してください。そうしないと、再作成されないものに応じて、エラーが発生するか、変更のメリットを十分に享受できなくなります。

于 2009-07-25T08:50:24.473 に答える
2

ラップテーブルアクセスをオーバーラップすることがある長期的なアプリのセットがあり、sybase がこのエラーをスローします。sybase サーバーのログを確認すると、発生した理由に関する完全な情報が得られます。同様に: ロックを取得しようとする 2 つのプロセスに関与した SQL。通常、1 つは読み取りを試み、もう 1 つは削除のようなことを行います。私の場合、アプリは別々の JVM で実行されているため、定期的にクリーンアップする必要があるだけで同期できません。

于 2009-11-23T17:47:25.490 に答える
0

テーブルが適切にインデックス化されている (そして実際にそれらのインデックスを使用している - 常にクエリ プランを介してチェックする価値がある) と仮定すると、SP のコンポーネント部分を分解し、それらを個別のトランザクションにラップして、各作業単位が完了するようにすることができます。次が始まる前に。

 begin transaction 
   update mytable1 
     set mycolumn = "test"
   where ID=1

 commit transaction
 go

 begin transaction 
  insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1
 commit transaction
 go
于 2009-07-10T20:15:01.623 に答える