概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Learn how to use nested transactions in a Ruby on Rails application
- 原文公開日: 2018/02/02
- 著者: Paweł Dąbrowsk
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』をどうぞお役立てください。