【Java】debug pointに止まらない!エラーも吐かない!何故だ?!〜transaction管理のお話!〜


その正体教えましょう
①connectionを生成
②setAutoCommit(false)にする
③処理をしまくる
④最終的にcommit(もしくはrollback)

と、した際に

「何故か③で停止してしまった!」

なんて方いらっしゃいませんか?
catch(throwable e)とかしても何も引っかからず
もはやデバッグポイントの途中でデバッグも消滅。

僕も初めてこの状況の陥った時に
頭の中が真っ白になり長考の末に
チームのリーダーに泣きつきました。

今日はこの現象を解決すべく観点を紹介します。


そいつの名はdeadlockだ!
そうなんです。
見出しでネタバレしましたが、
こいつはエラーでもなんでもありません。

ただのデッドロックです。

一度更新をかけた行に対して
一回もcommitせずに変更を加えようとしている時に
発生する愉快なお友達だそうです。

しかし何故こいつがデバッグポイントを消滅させるのか?
しかし何故こいつがエラーをはかないのか?

答えは単純でした。
「待機」しているからです。

30分後ぐらいにタイムアウトエラーが流れるので
それまで待てばエラーに出会えるとのことでした。笑

ちなみに即座にエラーを返したい際は
「select 〜 for update」で「nowait」を使うと良いとかなんとか。


まとめ
catch(throwable e)とかしても何も引っかからず
もはやデバッグポイントの途中でデバッグも消滅。

こんな事態に見舞われた際には
是非デッドロックを疑ってみてください。

ちなみにデッドロックに対する対処法は主に
①update(ないしはcreate)が1回で済むようにする
②途中でcommit処理を挟んであげる
だそうです(当たり前かww)。


最後まで読んでいただきありがとうございます。もしこの記事を気に入って頂けたようであればシェアをお願い致します。非常に励みになります。


コメントを残す