いままでもいろいろ考えてきましたが、例外が発生した時のポイント(あるいはその周辺)について再度考えて見ようと思います。
トランザクションスコープ
どこからどこまでをトランザクションの1範囲とするか、議論になりやすい対象のポイントとしては、
- 単一レコード
- 複数レコード(一定のグループ)
でしょうか。
トランザクション自体はできるだけ小さくまとめたほうが、デッドロックのリスクがないので、なるべく小さいほうがよいでしょう。
どんな例外をなげるか
通常のExceptionとして処理をするのか、あるいはカスタマイズした例外としてなげるのか。
できればなるべく細かいExceptionを投げたほうが、検知や障害対応がしやすいのでいいでしょう。
カスタマイズ例としては500エラー以外にはいかのようなものがあげられるとおもいます。
UnauthorizeException・・なんらかの権限がない403系のエラー
ValidException・・入力値などの検証が不完全なバリデーション系のエラー
例外を発生させたあとの検知
例外を出した後の処理ですが、なんらかのほうほうで検知、記録しておく必要性があると思います。
代表的な手法としては
- メールで連絡する
- エラーレポーティングサービス(例:Sentry)
- Slackなどのコミュニケーションツールに投稿する
- 独自にLogに記録する
などでしょうか。
後続処理
その場で処理をストップさせるかあるいは、エラーの記録だけをのこしてつづけるか。
一般的にはその場でストップさせることが多いかと思いますが、データを取り込んで1行ずつ実行していくような大量処理系のバッチ処理の場合、logに記録をのこして後続処理を継続する・・・などのパターンもあります。