29.4.5. デッドロック


本項ではデッドロックの問題を発見して解決する方法について説明しています。 何が Mbean をデッドロックしているか、 使用しているアプリケーション内でデッドロックをどのようにして検出するか、そしてデッドロックをどのようにしたら解決できるのかなどについて説明していきます。デッドロックは 複数のスレッドが共有リソース上でロックしている場合に発生する可能性があります。図29.8「デッドロックの定義例」 では、シンプルなデッドロックの発生例を示します。以下では、 Thread 1Bean Aのロック、Thread 2Bean B のロックを持っています。しばらくすると、Thread 1Thread 2Bean B を持っているためそれをロックしてブロックしようとします。同様にして Thread 2Thread 1 が A のロックを持っているためそれをロックしてブロックしようとします。この時点で、 両スレッドはデッドロックとなり、 他のスレッドですでにロックされているリソースへのアクセスを待機することになります。

図29.8 デッドロックの定義例

JBoss のデフォルトとなるロックポリシーは、トランザクションが完了するまでそのトランザクションのコンテキスト内に呼び出しが発生する場合に Entity bean をロックすることです。このため、多くのエンティティ bean にアクセスする長期実行のトランザクションがある場合や、 bean へのアクセス順序に注意を怠った場合にデッドロックは非常に簡単に発生します。デッドロックの問題を回避するためさまざまな技術や詳細設定を使用することができます。これらについては本項で後述します。

29.4.5.1. デッドロックの検出

幸い、JBoss はデッドロックの検出が可能です。JBoss には待機中のトランザクションや、ブロック中のトランザクションに関するグローバルな内部グラフがあります。エンティティ bean ロックを取得できないとスレッドが判断すると必ず、bean 上で現在ロックを保持しているトランザクションを割り出してそれ自体をブロック中のトランザクションのグラフに追加します。グラフの具体例を表29.1「ブロックされているトランザクションテーブルの例」に示しています。
Expand
表29.1 ブロックされているトランザクションテーブルの例
ブロックしている TX ロックを保持する TX
Tx1 Tx2
Tx3 Tx4
Tx4 Tx1
スレッドが実際にブロックを行う前に、デッドロックの問題があるかどうかを検出しようとします。検出はブロックトランザクショングラフを検討することによって行われます。グラフを検討するたびにブロックされているトランザクションの記録を残していきます。 グラフ内に複数回にわたりブロックされているノードを検出すると、デッドロックが発生していると認識して ApplicationDeadlockException を送出します。 この例外によりトランザクションのロールバックが行われて、このロールバックによりトランザクションが保持しているすべてのロックが解放されることになります。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat