2011年7月21日木曜日

(小ネタ)DBにはトランザクションがありますが

今回は超初心者向け

webでシステムを構築していると、「データ登録をしてメール送信」とか「データ登録してファイル削除」等の処理が必要になる場合があります。そこで

transaction do
  yyy処理      ①
  delete_files ②
  db登録処理   ③
  commit
end

とか

transaction do
  xxx処理    ①
  sendmail   ②
  db更新処理 ③
  commit
end

の様な処理をすると問題大有りです。何故でしょう?

...

データベース処理は通常ロールバックが可能ですが、「ファイルシステムへの変更」や、「送信してしまったメール」は元に戻す事ができません。

# ①②が正常に処理された後に、③で例外が発生した場合取り返しが付かない

よって上記の巻き戻し不能処理をする場合は、できるだけ処理の一番最後にもってくるべきです。例えば:
transaction do
  xxx処理
  db更新処理
  commit
end

sendmail

0 件のコメント:

コメントを投稿