ウイザードに大切なこと 本文へジャンプ
Ruby on RailsをEclipseでいこう その9 〜DBトランザクションを制御するの巻〜
これはイタズラです。Railsの思想に逆らうとどうなるか試してみました。

データベースを扱うシステムでは、テーブル間の整合性を保障するために、AテーブルとBテーブルへの更新が両方正常に行えた段階でコミットしたい時があります。

なので、今日はRuby on Railsでのトランザクション制御について。

ActiveRecordには、"transaction"というメソッド(っていうのかな?)が用意されているので、これにトランザクション処理ブロックを渡します。

具体的には、

その7とその8で作成したモデルを例にします。
モデルの呼び出し側(コントローラー)

@bookmark = Bookmark.new(params[:bookmark])
@item = Item.new(params[:item])

Bookmark.transaction(@bookmark, @item) do
#このブロック内部が1つのトランザクションとして扱われます。
#ブロック内部でSQLエラーが発生した場合はRollBackされます。
@bookmark.save
@item.save
end


今回の例では、2つのテーブルは同一DBにあるので、トランザクションはBookmarkでもItemでも、どちらのものを使ってもOK。

補足ですが、データベース自体がトランザクションをサポートしていることが前提の機能です。なので、MySQLのMyISAMのような非トランザクションタイプのデータベースでは、使えません。

分散データベース構成の場合の整合性は・・・まあ、あまり期待しすぎてはいかんですね。