Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails tips: トランザクションをネストする(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: トランザクションをネストする(翻訳)

Ruby on Railsにおけるトランザクションの概要や、アプリに機能追加するときに便利なトランザクションのコールバックについては既にご説明しました。今回はトランザクションのネストについて詳しく見ていきたいと思います。

ネストしたトランザクションを作成する

トランザクションは単なるRubyのブロックなので、次のように簡単にネストできます。

Post.transaction do
  Post.create!(title: 'Playing football')
  Post.transaction do
    Post.create!(title: 'Swimming')
  end
end

ネストしたトランザクションのロールバック

トランザクションをネストできたら、ロールバックもできるようにしたくなるでしょう。しかし驚いたことに、以下のコードではロールバックできません。

Post.transaction do
  Post.create!(title: 'Playing football')
  Post.transaction do
    Post.create!(title: 'Swimming')
    raise ActiveRecord::Rollback
  end
end

このコードを動かすには、本物のサブトランザクションを取得する必要があります。さもないとトランザクションの作成を取り消せません。これを行うにはrequires_new: trueオプションを渡します。このオプションは、PostgreSQL、MySQL、SQLite(3.6.8以降)で利用できます。

Post.transaction do
  Post.create!(title: 'Playing football')
  Post.transaction(requires_new: true) do
    Post.create!(title: 'Swimming')
    raise ActiveRecord::Rollback
  end
end

さらに詳しい情報

Active Recordは、MySQL/PostgreSQL/MS-SQL(真のネステッドトランザクションをサポートする場合のみ)でSAVEPOINTを用いることでトランザクションのネストをエミュレーションします。SAVEPOINTについて詳しくは、MySQLのSAVEPOINT、ROLLBACK TO SAVEPOINT、および RELEASE SAVEPOINT 構文をご覧ください。


RSpec & TDDの電子書籍を無料でダウンロード

もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。

関連記事

アトミックなトランザクションで冪等APIを強化する(翻訳)

Rails tips: ActiveRecordのトランザクションの概要(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。