😵

現場改善#021 まれに失敗するINSERT処理の謎

2022/11/20に公開

あらまし

かなりレアなケースなので、あまり参考にならないと思いますが、こんな事例もあった程度でお読みください。

同僚「この登録処理でたまにINSERTに失敗するんですけど、原因が分からないんです」
私「ちょっと見せてくれる?」
私「フムフム…関数長いね…これは時間かかりそう」
私「トランザクションがここから始まって…」
私「えっ!?こんなことってある!?」
なんてことがありました。

課題

  • 内製開発したシステムで、まれにINSERTに失敗する
  • 原因特定が長らくできておらず、暗礁に乗り上げていた
  • INSERTに失敗するケースは月に数回程度

対策

いろいろログを出力するように同僚には指示をしていましたが、長らく解決できず
暗礁に乗り上げていました。そこで、自分でもコードを追いかけていったところ、

トランザクション処理中に、条件によってはダイアログ表示されるようになっていた!!
という驚愕の事実が発覚。

その条件に入るケースだけ、ユーザーから入力を待つダイアログを表示しており、担当者がパソコンから離れて作業していると、タイムアウトが発生するというのが原因でした。

今回の件で、同僚にキレそうになりましたが、トランザクション内でユーザーの応答を求める処理を記述してはならないといったコーディング規約があるわけでもなく、下記を指導しました。

  • トランザクションの開始から終了までは可能な限り短時間で終わるようにコーディングしましょう
  • トランザクション内でユーザーからの入力を必要としない、作りましょう。
  • トランザクションをなるべく短時間で完了させる理由はロックする時間を短くするためです。
  • データの更新中はロック時間が発生するので、他の処理を待たせることになるからです。

もう一度同じことをするなら

今回の場合は、やはり開発をお願いする際に、 コーディング規約を作成し、トランザクションを使った開発についての注意点に記載する を実施するべきでした。

理想は、「コードレビューをする。」まで、考えましたが、地方情シスの社内SEだと開発をしてくれること自体が貴重なので、

  • そこまで手間かけたくない
  • 気分を害さずにコードレビューするノウハウがない
  • そもそも自分自身のコードの書き方に自信がない

という背景から、手が付けにくいです。社内SEの待遇改善と一緒ならもう少し突っ込ん改善できるかも。

Discussion