① 囲む
- 壊れてはいけない条件を、1行で書けたか
- その条件を守るために同時に確定させたい更新を、洗い出したか
- トランザクションの境界を、コードの上で指させるか
- 外部API・メール送信・ファイル生成・AI推論を、境界の外に出したか
- 人の入力や画面操作を、またいでいないか
- 関係のない更新まで、囲みに入っていないか
② 守る
- データベースの制約で守れる条件がないか、先に確かめたか
- 「読んで・計算して・書く」を、条件つきの1文の更新にできないか試したか
- 排他制御の方式(制約/1文UPDATE/楽観/悲観)を、先に1つ選んだか
- 楽観ロックなら、更新件数が0だったときの処理を書いたか
- 悲観ロックなら、押さえている間に重い処理を挟んでいないか
- ロックを取る順番を、システム全体で1つに決めて書き残したか
- 分離レベルを、動いている環境の実際の設定で確認したか
- ロックの範囲が広がりすぎていないか、実行計画を見たか
③ 諦める
- ロック待ちのタイムアウトを決めたか
- デッドロック時の再試行の回数と待ち方を決めたか
- 再試行してよい処理と、してはいけない処理を分けたか
- 楽観ロックで負けたとき、利用者に伝えて読み直せるようにしたか
- 例外時に、確実にロールバックされる形になっているか
- 競合・デッドロックの件数をログに残しているか
- 同時更新のテスト(同じ行に2件・残り1に2件・逆順で2件)を書いたか
この内容は記事「AIにトランザクション境界と排他制御を相談する|整合性の詰め方」のチェックリストです。印刷してそのままお使いいただけます。 / 無料ツール一覧へ