ryota21silvaの技術ブログ

Funna(ふんな)の技術ブログ

これまで学んだ技術の備忘録。未来の自分が救われることを信じて

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