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のトランザクションの概要(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ