問題タブ [deadlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - read-uncommit による InnoDB デッドロック! - Java - Glassfish - EJB3 (JPA/Hibernate)
Glassfish を使用した Java アプリケーションでデッドロックの問題が発生してから数日が経ちました - MySQL InnoDB を使用した EJB3
構成: Mysql InnoDB: Ver 14.12 Distrib 5.0.51a、readline 5.2 を使用する debian-linux-gnu (i486) 用
アプリケーション サーバー: Glassfish v2.1
EJB3 での永続化 - JPA - Hibernate
簡単にするために、私が持っている-サービスへのユーザーのサブスクリプション、ログオン、ログオフ、支払い、登録などを処理するサーブレットを備えたSOAシステム...-これらのサービスの毎日の減少を処理するクォーツジョブシステム(cronトリガー)、 「低信用」警告の生成、支払いの検証など...
私の問題:負荷テスト中にどこでもデッドロックが発生しました (100 000 ユーザーのシミュレーション - 30 リクエスト/秒)
返されたスタック サンプル:
終わりに注意してください、それは私が行ったコードです: net.xxx.server.dao.impl.PaymentDAOImpl.listPaymentsByStateAndCompany(PaymentDAOImpl.java:270)
この機能:
この関数は、負荷テストを行っていない場合、たとえば 5 秒ごとに 1 つのリクエストがある場合に完全に機能します。
負荷テスト中、高頻度 (たとえば 5 秒ごと) で実行されるジョブがあります。
このエラーだけが発生するのではなく、他のジョブの他のエラーも発生します (まだデッドロック)!
MYSQL の場合:
デッドロックの例:
トランザクション分離
トランザクションの分離についてインターネットで読みました。
グラスフィッシュでは、トランザクションの分離レベルを設定できます。私はそれを読み取り非コミットにしました。
うまくいかなかったので、mysqlに同じレベルを設定しました:
SVP 誰かが私に何が問題なのか教えてもらえますか? 本当にわからない!!!!
ところで、私はインターネットで見たことがありますが、リクエストごとにトランザクション分離レベルを選択できます... JPA でメソッドのトランザクション分離レベルを直接設定することは可能ですか? グローバルなデータ更新 (15000 サービスのデクリメントなど) を行うジョブのみを読み取り非コミットにする必要があると思いますが、間違っていますか?
python - スレッドを使った Python の組み込み -- デッドロックを回避するには?
Python を埋め込み、Python から C++ へのコールバックを許可し、Pythhon コードがスレッドを生成できるようにし、デッドロックを回避する方法はありますか?
問題はこれです:
Python を呼び出すには、GIL を保持する必要があります。通常、これを行うには、最初にインタープリターを作成するときにメイン スレッドの状態を取得し、次に PyEval_RestoreThread() を使用して GIL を取得し、Python を呼び出す前にスレッドの状態をスワップします。
Python から呼び出された場合、ホストの別のクリティカル セクションによって保護されている保護されたリソースにアクセスする必要がある場合があります。これは、Python が (最初に呼び出したスレッド以外のスレッドから) GIL を保持し、保護ロックを取得しようとすることを意味します。
Python を呼び出すときは、同じロックを保持する必要がある場合があります。たとえば、オブジェクトのコレクションを繰り返し処理している可能性があるからです。
問題は、Python を呼び出すときに GIL を保持していても、Python が GIL を放棄し、別のスレッドに渡してから、そのスレッドがホストに呼び出され、ホストのロックを取得することを期待している可能性があることです。一方、ホストはホスト ロックと GIL ロックを取得し、Python を呼び出します。デッドロックが発生します。
ここでの問題は、私が GIL を呼び出している間、Python が GIL を別のスレッドに放棄することです。それが期待されていることですが、ロックをシーケンスすることは不可能です-最初にGILを取得し、次に独自のロックを取得し、次にPythonを呼び出しても、Pythonは別のスレッドからシステムを呼び出し、独自のロックを取得することを期待しています. (GIL を解放することでシーケンスを解除したため)。
システム内で考えられるすべてのロックに GIL を使用するシステムの残りの部分を作成することはできません。Python がそれを別のスレッドに解放する可能性があるため、それは正しく機能しません。
ホスト内のすべてのコードを制御できないため、Python に入るときにホストがロックを保持していないことも保証できません。
それで、これができないのはただの場合ですか?
sql - NOLOCK はいつ使用するのが適切ですか?
実行時間の長いクエリでタイムアウトの問題やデッドロックが発生することがあります。
NOLOCK をいつどこで使用するのが最も適切なのか疑問に思っています。
更新と挿入で使用しますか? または読み取りますか?
sql-server - SQLServer デッドロック
データベースで複数の同時 CRUD 操作を実行している Java アプリケーションがあります。SQLServer のサポートを追加していますが、同時削除中のデッドロックに問題があります。調査の結果、問題は特定のテーブルでのロックのエスカレーションが原因である可能性があることがわかりました。
それを修正しようとして、デッドロックを回避できるように、UPDLOCK ヒントを使用して、問題のテーブルのすべての読み取りを「更新のために」行うことにしました。しかし、私はまだ問題を見ています。SQLServer でトレースを有効にしましたが、SQLServer ログに次のデッドロック トレースが見つかりました。
デッドロックが発生しました .... デッドロック情報の出力 グラフ待ち
ノード:1 キー: 5:72057594042384384 (54048e7b3828) CleanCnt:3 モード:X フラグ: 0x0 許可リスト 1: 所有者:0x03D08C40 モード: X フラグ:0x0 参照:0 ライフ:02000000 SPID:62 ECID:0 XactLockInfo: 0x04834274 SPID: 62 ECID: 0 ステートメント タイプ: DELETE 行番号: 1 入力 Buf: 言語イベント: (@P0 nvarchar(4000))delete from part_data where part_id = @P0 要求元: ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 モード: U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378) 値:0x3d08500 コスト:(0/1296)
ノード:2
キー: 5:72057594042384384 (f903d6d6e0ac) CleanCnt:2 モード:X フラグ: 0x0 許可リスト 0: 所有者:0x03D088A0 モード: X Flg:0x0 Ref:0 ライフ:02000000 SPID:60 ECID:0 XactLockInfo: 0x04B511EC SPID: 60 ECID: 0 ステートメント タイプ: DELETE 行番号: 1 入力 Buf: 言語イベント: (@P0 nvarchar(4000))delete from part_data where part_id = @P0 Requested By: ResType:LockOwner Stype:'OR'Xdes:0x04834250 Mode: U SPID: 62 BatchID:0 ECID:0 TaskProxy:(0x047BA378) 値:0x3d089e0 コスト:(0/4588)
犠牲者リソース所有者: ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 モード: U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378) 値:0x3d08500 コスト:(0/1296)
SQLServer プロファイラーは、これを 2 つのクライアントが更新 (U) ロックを保持し、排他 (X) ロックにエスカレートしようとしていると示しています。私が読んだ SQLServer のドキュメントでは、ある時点で 1 つのクライアントのみがテーブルを (U) ロックできると書かれているため、なぜトレースに示されている状況が表示されるのか疑問に思っています。
そのトレースで参照されているデータベース オブジェクトは、外部キーのインデックスです。この種の問題を修正した経験のある人がアドバイスを提供できれば、それは大きな助けになるでしょう.
ありがとう、ブラッド。
EDIT は、要求に応じてデッドロック グラフ xml を追加しました。
sql-server - 読み取り専用アクセスでデッドロックを作成することは可能ですか?
ADO を介して MSSQL2000 サーバー上の単一のテーブルにアクセスする VB6 アプリケーションがあります。読み取り専用アクセス (adOpenStatic、adLockReadOnly) を使用しています ネットワークには、テーブルに変更を加える他のアプリケーションがあります。
なんらかの理由で、自分のアプリケーションがデッドロックの対象として選択されているというエラーが発生します。
私は本当に混乱しています: 1 つのテーブルから読み込んでいるときにデッドロックが発生するのはなぜですか? 他のアプリケーションの書き込みのためにタイムアウトが発生すると予想されますが、デッドロックではありません...
誰かがこれに光を当てることができますか?
UPDATE: 2009-06-15私はまだこの問題の解決策に興味があります。だから私はいくつかのより多くの情報を提供しています:
- adOpenForwardOnly または adOpenStatic を選択しても違いはありません
- カーソル位置がクライアントかサーバーかは関係ありません。
sql - Oracle デッドロック検出ツール
Oracle クエリと PL/SQL プロシージャ (トリガー、制約など) の静的アナライザーを探しています。これは、DB スキームを渡し、潜在的なデッドロックを指摘するツールです。JavaのFindBugsと同じです。
そのようなツールが存在しない場合、あなたはそれを持ちたいですか?
java - j2me ネットワーク、スレッド、およびデッドロック
以下の単純な midlet コード (クラス Moo) (抜粋の後) はデッドロックします (少なくとも、スレッドに関するこの投稿を読んだ後はデッドロックになると思います)。
投稿から関連する抜粋を再現しました:
問題の根本は、open() 呼び出しのブロッキング性にあります。一部のプラットフォームでは、システムが実際の接続を内部で、別のスレッドと同等に行います。接続スレッドが接続を確立するまで、呼び出しスレッドはブロックされます。同時に、セキュリティ サブシステムはユーザーに接続の確認を要求する場合があり、イベント スレッドがユーザーから確認を取得するまで接続スレッドはブロックされます。イベント スレッドが既に接続スレッドを待機しているため、デッドロックが発生します。
ここでシステム スレッドの呼び出しがどのように行われるか (イベント スレッドと通知スレッド)、およびデッドロックにつながる一連のイベントを教えてください。ここでデッドロックにつながるスレッドが何であるかについては明確ではありません。
- j2me スレッド モデルに関するドキュメントはありますか?
- j2me システム クラスのソースはどこで入手できますか (接続クラスの実装を調べたいのですが)?
編集:上記のコードでは、ロジックを取得します。しかし、以下のコードは少なくとも正しく動作するはずですか? これは、別のスレッドでネットワーク接続を行っている場所でもデッドロックします。
code>multithreading - DCOM/COM+ アクティブ化オブジェクトは CPU をデッドロックできますか?
COM+ アプリケーションの CPU レベルのデッドロックをどのように把握しますか? これは Win2K 上で動作するアプリケーションです。負荷に関係なく、他のすべてのオブジェクトによって使用される 1 つのオブジェクトが突然呼び出し時間を増やし始め、システムがクラッシュします。システムを通常の動作状態に復元する唯一の方法は、COM+ アプリケーションを再起動することです。
興味深いのは、この状態を QA や DEV で再現できないことです。唯一の違いは、CPU ヘッドカウントとメモリです。
COM+ アプリケーションは、MSDAORA を使用して v9.2 クライアントを使用して Oracle v9.2 DB に接続する n 層モデルのアプリケーション コンポーネントです。
アイデア/考えは非常に高く評価されています。
c# - lock(this) を使用してデッドロックを説明するサンプル コード
lock(this)
別のスレッドが同じキーをロックしてデッドロックを引き起こす可能性があるため、 , lock(typeof(MyType))
,lock("a string")
はすべて悪い習慣であるという記事や投稿をいくつか読みました。この問題を理解するために、デッドロックを説明するサンプル コードを作成しようとしましたが、これについて理解することができませんでした。
誰かがこの古典的な問題を説明する簡潔なコードを書くことができますか? 短くしてください。コードを小さなチャンクでしか消化できません。
編集: lassevkはそれをうまくまとめていると思います。本当の問題は、ロックを制御できなくなったことです。これが発生すると、ロックが呼び出される順序を制御できなくなり、潜在的なデッドロック状態が発生する可能性があります。
lock(this)
、lock(typeof(MyType))
などはすべて、制御できないロックを選択した状況です。
asp.net - SQL2008のロックとブロックされたテーブルを確認する方法
私のアプリのASP.NET実行中に、SQL 2008 Expressがロックを保持しているようで、
操作またはサーバーが応答していません
たぶん私のクエリのいくつかは最適化されていません。VisualStudioが次の場合にクラッシュします。
すべてのファイルを保存して終了します。
どのクエリがテーブルをブロックしているかを確認する必要がありますが、Expressバージョンがあります。どのようにできるのか?
ありがとう