🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1583閲覧

transactionでうまくrollbackされない。

oiykram

総合スコア11

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/11/28 09:07

編集2021/01/16 02:10

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

データベースエンジンによっては、トランザクションをネストできないことがあります。

トランザクションが1段で済むようにコードを書き直す、あるいはトランザクションをネスト可能なエンジンに入れ替える必要があります。

投稿2020/11/28 10:05

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問