Userモデル、Libraryモデルがあります。
@usersには複数の利用者情報、@librarysに複数の図書館情報がはいっています。
@usersをwebに追加。各図書館のdbにも情報を追加するとします。
流れとしては、
1、図書館のhostとportからdbに接続。
2、利用者を登録するinsert文を各dbへなげる。
3、1,2を繰り返して全ての図書館に保存する
4、すべてコミットできれば、webも登録
webも登録できれば、次の利用者情報についても1~4を行う。
ここで、図書館への接続が失敗した場合に、登録する前に戻すようにしたいです。
Active::Base.transaction do を使って試みたのですが、
最初の図書館へ登録はできましたが、次の図書館への接続ができなかった場合に、最初の図書館
へ登録した利用者情報は登録されたまま、残っていました。
うまくロールバックできません。。
うまくロールバックできる方法はありますでしょうか?
ご教授の程よろしくお願いします。
user_controller.rb
usercontroller
1def import 2 .......... 3 User.transaction do 4 begin 5 @users.each do |user| 6 ........ 7 q = #INSERT文 8 9 libraries.each {|p| #各図書館へinsert 10 client = #dbへ接続 11 p.query("start transaction") 12 p.query(insert) 13 14 if user.save #webに登録できれば、localにcommit 15 p.query("commit") 16 after_array << client 17 end 18 } 19 end # users end 20 rescue => e 21 logger.error e 22 23 after_array.each {|p| # error出たら、rolllback 24 p.query("rollback") 25 } 26 27 end
end #transaction end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。