IT-Q

デッドロックが起きたらどうなりますか。

DB が検知して片方を強制終了し、アプリには例外が飛びます。DB::transaction の第2引数でリトライ回数を指定できますが、根本対策は更新順序を揃えて発生自体を減らすことです。

面接官が見ているのは例外処理とリトライまで考えているか。

これは「トランザクションを張る範囲として妥当なのはどれですか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • DB が片方を強制終了して例外が飛ぶ。第2引数でリトライ回数を指定できる
    その通りです。根本対策は、複数テーブルの更新順序をコード全体で揃えることです。順序がバラバラだと必ず起きます。
  • 両方のトランザクションが自動的に成功する
    デッドロックは両立できない状態なので、片方は必ず犠牲になります。
  • アプリが停止するまで待ち続ける
    DB がタイムアウトで検知して打ち切ります。
  • データが壊れる
    壊れません。ロールバックされるので整合性は保たれます。

面接官は何を見ているか

  • DB側で片方が強制終了され、例外になると説明できた
  • DB::transaction() の第2引数でリトライ回数を指定できると知っていた
  • 発生を減らす方法(更新順序を揃える等)に触れた

模範解答

DB が検知して片方のトランザクションを強制終了し、アプリには例外が飛びます。DB::transaction($closure, 3) のように第2引数でリトライ回数を指定でき、デッドロック時は自動で再試行されます。ただし根本対策は発生を減らすことで、複数テーブルを更新する順序をコード全体で揃えるのが基本です。順序がバラバラだと必ず起きます。