Help us understand the problem. What is going on with this article?

Rails で宣言的トランザクション #ginzarb

More than 3 years have passed since last update.

ぎんざRuby会議01 で宣言的トランザクションの話になって、 @a_matsuda さんが Rails にも宣言的トランザクション欲しくない?的なことを言っていたので gem でサクッと作ってみました。


宣言的トランザクションとは、あるメソッドが呼び出された時に自動的にトランザクションをかける、ということを宣言的に記述する手法のことです。実装しているフレームワークとしては Java の Spring Framework が有名です。Spring Framework の場合、メソッドに @Transactional というアノテーションを付与することで宣言的トランザクションを使用することができます。

public void create(int id) {
    // do something


Gemfile に追加して bundle install してください。

gem 'transactional'

あとは Controller でトランザクションをかけたい action を transactional に指定するだけです。

class YourController < ApplicationController
+  transactional :create, :update
  def index

  def create
    Post.create!(name: 'john', age: 42)
    Topic.create!(title: 'invalid title')
    render plain: :created

  def update

とすると、指定した action が呼ばれたときに自動的にトランザクションがかかります。

Processing by YourController#create as HTML
   (0.2ms)  BEGIN
  SQL (0.5ms)  INSERT INTO "posts" ("name", "age", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "john"], ["age", 42], ["created_at", "2017-08-06 08:23:13.980493"], ["updated_at", "2017-08-06 08:23:13.980493"]]
   (0.2ms)  ROLLBACK

この例では Topic の create! で例外を吐いた際に posts の INSERT がロールバックされているのが分かります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away