2009-07-10 9 views
6

INSERTとUPDATEを実行するストアドプロシージャ(.NETアプリケーションから)を実行すると、時には(しばしば実際にはそうではない)ランダムにこのエラーが発生する:Sybase ASE:「サーバーコマンドでデッドロックが発生しました」

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Your server command (family id #0, process id #46) encountered a deadlock situation. Please re-run your command.

どうすればこの問題を解決できますか?

ありがとうございました。

+1

デッドロックが何であるのか、デッドロックが発生する理由、そしてなぜあなたの*コードで*起こっているのか分かりますか?あなたは "サイベース"と "デッドロック"のようなグーグルリングを試みたことがありますか? – ChrisW

+0

はい私はそれが何であるか知っています、はい私はグーグルをしました。事は、デッドロックが非常にまれに起こることです。クエリは単純なもの(更新と挿入)であるため、他のいくつかのロックがそれをブロックしているだけでなく、それをスローするのではなく、サーバーによって最悪の場合*遅延されます。また、このエラーは、デッドロックがどのようなものであったか(どのテーブル、行など)が問題を解決するのが難しいかを示すものではありません。私は手動で同時に2つのクエリがサーバーに到着するのを防ぐことはできません! – Laurent

+1

デッドロックは他のプロセスを遅らせることはありません。他のプロセスは停止しています。デッドロックについては、理解を示していないので詳細を読むでしょう。 – Mark

答えて

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 
+0

実際には、今日私は再び同じ問題を抱えていました.1つのステートメント(INSERT)しか含まれていないストアドプロシージャがあります。 – Laurent

6

あなたの最善の策は、1

毎回これが印刷され、デッドロックがあり、「印刷デッドロック情報を」

sp_configureを使用して上に「印刷デッドロック情報」を設定することですどのプロセスが関与していたか、デッドロック時に実行していたSQLに関する情報。

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

2

私は時にはラップテーブルアクセスを超える長期的なアプリを持っており、sybaseはこのエラーをスローします。 sybaseサーバ・ログをチェックすると、それが起こった理由に関する完全な情報が得られます。 Like:ロックを取得しようとしている2つのプロセスが関与していたSQL。通常は1つは読み込みを試み、もう1つは削除のようなことをします。私の場合、アプリケーションは別々のJVMで動作しているので、定期的に定期的にクリーニングする必要はありません。

関連する問題