概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / ActiveRecord - transactions overview
- 原文公開日: 2018/01/23
- 著者: Paweł Dąbrowsk
Rails tips: ActiveRecordのトランザクションの概要(翻訳)
トランザクションとは、データベースレコードの作成といった細かな操作の集合であり、多くの場合、外部API呼び出しと組み合わせられます。たとえばゲストブックアプリを作成していて、ゲストの何人かがレコード作成に失敗することがあったとしても大したことはありませんが、オンラインストアでユーザーに課金するときにどこかでうまくいかなかった場合のことを考えてみましょう。
連続した操作のどこかで何かが失敗したら、そこまでの変更を取り消して、再度ユーザーに情報の入力と操作の再開を促したくなるでしょう。失敗した処理中に作成されたレコードはすべて削除しなければなりません。こうした処理はRailsのトランザクションでも行えます。
Railsのトランザクション作成
モデルのクラスやモデルのインスタンス(より一般的にはActiveRecord::Base
)で.transaction
を呼び出さなければなりません。用途に応じて最適な方法を選びます。1つのトランザクションは、そのモデルのインスタンスではなく、1つのデータベース接続に紐付けられます。
Order.transaction do
@order.charge_credit_card!
@user.order_histories.create!(@order)
end
@order.transaction do
@order.charge_credit_card!
@user.order_histories.create!(@order)
end
ActiveRecord::Base.transaction do
@order.charge_credit_card!
@user.order_histories.create!(@order)
end
トランザクションが失敗したとき
ぜひとも覚えておいていただきたい重要事項は、トランザクションのロールバックはエラーがraiseされたときしか行われないことです。トランザクションのブロック内でfind_by
メソッドを使うなら、find_by!
を使ってアプリで何らかの問題が生じたときにエラーがスローされるようにすべきです。トランザクションがロールバックした後でエラーがトランザクションブロックの外でraiseされ、エラーがキャッチできるようになります。
トランザクションを静かにロールバックさせたいのであれば、単にトランザクションブロック内でActiveRecord::Rollback
をraiseします。
トランザクションの詳細について
本記事はRailsトランザクションの概要をご紹介いたしました。ネストしたトランザクションやコールバックについても言及する値打ちがありますので、今後の記事にご期待ください。
Railsでお困りの方にお知らせ
知りたいことがありましたら、twitter または連絡用フォームにてお気軽にお問い合わせください。
RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。