webでシステムを構築していると、「データ登録をしてメール送信」とか「データ登録してファイル削除」等の処理が必要になる場合があります。そこで
transaction do yyy処理 ① delete_files ② db登録処理 ③ commit end とか transaction do xxx処理 ① sendmail ② db更新処理 ③ commit end
の様な処理をすると問題大有りです。何故でしょう?
...
データベース処理は通常ロールバックが可能ですが、「ファイルシステムへの変更」や、「送信してしまったメール」は元に戻す事ができません。
# ①②が正常に処理された後に、③で例外が発生した場合取り返しが付かない
よって上記の巻き戻し不能処理をする場合は、できるだけ処理の一番最後にもってくるべきです。例えば:
transaction do xxx処理 db更新処理 commit end sendmail
0 件のコメント:
コメントを投稿