前提
とあるWebシステムの保守作業、あるデータ登録機能でデッドロックが発生しまして、その対処を行っています。
私が参画前の1年ほど前のリリース以降に発言した障害で、本来であればデッドロックの根本原因を突き止めてから対処したいところですが、
如何せん十数年運用されているそれなりの規模のシステムで、最近参画した私が意見したところで一蹴されるのみでした。
つまりはかなーり上の方から、対症療法でさっさと直せっていうお達しですので、「そもそもデッドロックは~」という話は今回はなしでお願いします。。。
実現したいこと
・Thread.sleep使うの初めて。。。
・所定条件を満たした際、Thread.sleep(n * 1000)で待機処理をしたい。
実装したThread.sleep(n * 1000)まで到達し、実行されていることは確認済み
バージョン
Java6
発生している問題・エラーメッセージ
java.lang.InterruptedException: sleep interrupted
該当のソースコード
■元々のソース
java
1public List<String> executeSQL(param) { 2 return executeSql; 3}
■修正後
java
1public List<String> executeSQL(param) { 2 return deadlockRetry(param); 3} 4 5// デッドロック対処メソッド 6private deadlockRetry(param) { 7 for (int retryCnt = 0; retryCnt <= maxCnt; retryCnt++) { 8 try { 9 // SQL実行 10 } catch (SQLException e) { 11 int errCode = e.getErrorCode(); 12 if (errCode == 1205) { 13 Thread.sleep(10000); 14 continue; 15 } else { 16 throw e: 17 } 18 } 19 break; 20 } 21}
試したこと、状況
・元々の作りの問題で、デッドロックの発生箇所はログから判明しているが、突合した相手のプロセスは判明していないため、強制的にデッドロックを発生させており、再現環境ではない。
→ Eclipseの表示ビューから強制的にnew SQLExceptionをスローしているがその影響はあるか?
・私自身がThreadについてあまり知見が深くない。
・調べたところ、他スレッドからの干渉があった場合に当該エラーが発生することは認識。
→ それ以上の調査結果が得られなかった・・・
・Thread.sleepの実行位置は最初に動くmainスレッドからすると4スレッド目
(main → logic → dao:SQL実行 → dao:デッドロック対処メソッド)
・デバッグで確認するも呼び出し元の上位3スレッド以外のスレッドは存在しない。
聞きたいこと
Thread.sleepが正しく発動する条件。
→ そもそもmainスレッドレベルでsleepをかけないと、呼び出し元スレッドが干渉してくることがあるのか?
→ それとも実装方法に問題あり?
Thread.sleep以外にもっとベターな待機処理があるかどうか。
不備不足あれば追記いたしますので、ご指摘いただけると幸甚です。

回答2件
あなたの回答
tips
プレビュー