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

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

詳細はこちら
Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

1048閲覧

再投稿です。Transactionでうまくrollbackできない。。

oiykram

総合スコア11

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2021/01/16 02:15

編集2021/01/16 16:22

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 28 29 end #transaction end 30 31end

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

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

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

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

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

guest

回答1

0

図書館のhostとportからdbに接続

あくまでトランザクションは1つのデータベースサーバ内での処理に対するものです。別なデータベースサーバに接続する場合には、データベースのトランザクションでは対応できません。

投稿2021/01/16 02:32

maisumakun

総合スコア145963

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問