basyura's blog

あしたになったらほんきだす。

Sequel で トランザクション管理

直感的に Users.create が独立してるように見えてトランザクション管理されないように感じるんだけど、 素直に transaction を使えばいい。

require 'rubygems'
require 'sequel'

# DB オープン
DB = Sequel.sqlite("transaction.db")
# テーブルを生成
unless DB.table_exists? :users
  DB.create_table :users do
      primary_key :id
      text :screen_name, :unique => true
      text :description
  end
end
# モデル定義
class Users < Sequel::Model ; end
# テーブルからレコードを削除
Users.delete
# レコードを追加
Users.create(
  :screen_name => "aaaa",
  :description => "ああああ"
)
# トランザクション開始
DB.transaction do
  # レコードを追加
  Users.create(
    :screen_name => "bbbb",
    :description => "いいいい"
  )
  # エラー発生。コミットがロールバックされる。
  raise "コミットさせないよエラー"
end

screen_name => "aaaa" のレコードが追加されるけど、"bbbb" のレコードは追加されない。