transactionについて
transactionとは
DBを使う場合、安全で確実なデータ操作とデータ管理が重要です。
例えば、お金の入出金で、出金者がちゃんとお金を振り込んだのに、入出金処理の途中で処理が中断され、入金の内容だけデータベースに反映されていない、なんてことが起こると大変。
そのために使われる仕組みの一つがトランザクション。
コードで説明
以下の例だと、do~endのブロック内に記述している処理が、一つのトランザクションとみなされる。
この2つの処理のうち片方が失敗すれば、もう片方の処理をロールバックさせる。
つまり、トランザクション内の処理は「全部成功するか」「全部失敗するか」の2つしか無い。
また、例外処理が起きるとロールバックが発火するため、save!としている。
(app/controllers/admin/articles/article_blocks_controller.rb) Article.transaction do @article.body = @article.build_body(self) @article.save! end
追記
複数のデータベースをいじる時も、トランザクションでまとめると良い(業務アプリケーションでは必須)。
例: 1. 親モデルをnew→親モデルをsaveして 2. 子モデル(関連テーブル)をbuild
ActiveRecord::Base.transactionで囲んで、save!とかで例外を起こすようにするだけ、
ActiveRecord::Base.transaction do DBをいじる処理など save! end