なので、今日は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のような非トランザクションタイプのデータベースでは、使えません。
分散データベース構成の場合の整合性は・・・まあ、あまり期待しすぎてはいかんですね。