Edited at

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

More than 1 year has passed since last update.

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

https://github.com/ttanimichi/transactional


宣言的トランザクションとは

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

@Transactional

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


使い方

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

gem 'transactional'

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

class YourController < ApplicationController

+ transactional :create, :update
+
def index
end

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

def update
end
end

とすると、指定した 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 がロールバックされているのが分かります。