railsでもtransaction機能を使おう

railsからプログラミングをやりだした自分は、どうしてもsqlの機能についておろそかになってしまいます。

sqlの処理はデータベースの処理なので、大切なユーザーのデータです。

すいません、削除しちゃいました(テヘ

では、問題がすみません。

そんな大事なデータを連続処理をする場合に、使うのがtransactionです。

使い方

一つの処理で連続して、何かをする場合は、transactionをつけましょう。

例えば、ユーザーが記事を更新した場合に、一番最後の記事を消したい場合があったとします。(そんなことないと思うが・・・苦笑)

  def update
    @post.update(post_params)
    Post.last.destroy
  end

この場合、一連の処理を流れにしているので、万が一Post.last.destroyで失敗した場合に、処理を全部戻したいとします。

そんな時に使えるのが、transactionになります。

  def update
    ActiveRecord::Base.transaction do
      @post.update(post_params)
      Post.last.destroy
    end
  end

transactionをするには、error(例外)を検出しないといけないので、下記のようになります。

  def update
    ActiveRecord::Base.transaction do
      @post.update!(post_params)
      Post.last.destroy!
    end
  end

!をつけて、error(例外)を出させるようにします。

ただのupdateでは、true or falseしか返ってこないので、transactionが反応してくれません。

これで処理がどこかでおかしくなった場合は、すべての処理が巻き戻ります。

sqlすげー・・・

まとめ

transactionを使うことで、一連の処理をしている場合に、巻き戻しを行うことができるようになります。

個別の処理の場合は、if文で処理を書けば対応できることが多いと思います。

ポイントは次のところですね。

  • 連続して処理を行う場合
  • error(例外)を出させる

参考

www.atmarkit.co.jp