Java 6アプリケーション内からデータベースのデッドロックを処理するための優れた戦略を探しています。複数の並列スレッドが同時に同じテーブルに書き込む可能性があります。データベース(Ingres RDMBS)は、デッドロックが検出された場合、セッションの1つをランダムに終了します。マルチスレッド - データベースデッドロックの回避と対処
デッドロック状況に対処するには、次の要件がありますが、どのような技術がありますか?
- 総経過時間が 有意な(測定可能な)を招くであろうセッションを殺す
- 合理的に可能な限り小さく を保つべきである
- 時間スレッドが
する方法がありませんロールバックすなわち互いに通信 戦略は自律的でなければならない
これまでのところ、私が考えた戦略は次のとおりです。
short attempts = 0;
boolean success = false;
long delayMs = 0;
Random random = new Random();
do {
try {
//insert loads of records in table 'x'
success = true;
} catch (ConcurrencyFailureException e) {
attempts++;
success = false;
delayMs = 1000*attempts+random.nextInt(1000*attempts);
try {
Thread.sleep(delayMs);
} catch (InterruptedException ie) {
}
}
} while (!success);
どのように改善できますか?例えば一定量(マジックナンバー)秒待つ。 より良い結果が得られる戦略はありますか?
注:デッドロックが実際にはほとんど発生しないように、いくつかのデータベースレベルのテクニックが使用されます。また、アプリケーションは、同じテーブルに同時に書き込むスレッドのスケジューリングを回避しようとします。上記の状況は単なる「最悪のシナリオ」に過ぎません。
注:レコードが挿入されるテーブルは、ヒープパーティションテーブルとして編成され、インデックスはありません。各スレッドはそれ自身のパーティションにレコードを挿入します。
指数関数は良いと思う - 私はそれをシミュレートしようとします! 私がこのノートで触れたように、アプリケーション設計は、データベースへのアクセスを好都合に配置することを含むデッドロックを回避することを目的としています。しかし、コーナーケースでは、多数のデッドロックが発生するという保証はありません。 – Adrian
"指数関数的バックオフ"テクニックに関する技術的な参考資料はありますか? – Adrian
これは、輻輳を回避するためにネットワークプロトコルで一般に使用されます。 wikiの記事をチェック:http://en.wikipedia.org/wiki/Exponential_backoff しかし、基本的な考え方は簡単です。何回かの指数関数を使用して、各再試行時の遅延を決定するだけです。正確な詳細は、あなたの目的に合わせて調整することができます。もちろん、最も簡単な実装は、2^n ms(ここでnはこれまでの再試行の回数)の間遅延することです。しかし、たぶんあなたは成長が遅すぎると思ったり、始まりが遅すぎたり、成長が遅すぎたりします。その後、乗算器を追加するか、または何かをnに追加します – jalf