質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

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

Ruby

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

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Q&A

解決済

1回答

1054閲覧

[ruby on rails] transactionとpayjpを使用してデータの一貫性を保ちたい。

tomtomtomtom

総合スコア563

Ruby on Rails 5

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

Ruby

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

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

0グッド

0クリップ

投稿2020/10/19 10:41

編集2020/10/24 20:05

transaction、payjp初心者です。
以下のようなアクションで
payjpで支払いをして
paymentsテーブルにsave!して
itemsテーブルにupdata!しています。

def create ActiveRecord::Base.transaction do item = Item.find(params[:item_id]) item.stock -= params[:quantity].to_i payment = Payment.new(payment_params) Payjp.api_key = ENV["PAYJP_SECRET_KEY"] charge = Payjp::Charge.create( amount: item.price.to_i * params[:quantity].to_i, customer: Card.find_by(user_id: current_user.id).customer_id, currency: 'jpy' ) payment.charge_id = charge.id payment.save! item.update!(stock: item.stock) redirect_to root_path rescue @item = Item.find(params[:item_id]) render "new" end end

間違っていたら申し訳有りません。
この場合、ActiveRecord::Base.transaction do 〜 rescue 間の
一連の処理に問題がない場合のみ
DBに反映されるのでデータの一貫性が担保されるものと理解しております。

質問内容は
Payjp::Charge.createが問題なく処理され、その後、payment.save!、item.update!で問題が発生した場合、
①Payjp::Charge.createは取り消されるのでしょうか?
②また、取り消されない場合はどのような処理を追記すべきでしょうか?
③Payjp::Charge.createで問題が発生した場合は
この記述でデータの一貫性が保たれると考えていますが、自分の考えに間違いはないでしょうか?

以上3点になります。
自身で様々なサイトを参考にして書きました。
問題点などありましたらご指摘いただきますと幸いです。
それでは宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「ActiveRecord::Base.transaction do 〜 rescue 間の一連の処理に問題がない場合のみDBに反映されるのでデータの一貫性が担保される」
それは合っています。

しかし「Payjp::Charge.create」は別のdatabase(というかシステム)の処理ですので
「①Payjp::Charge.createは取り消され」ません。
「②また、取り消されない場合は」Payjp::Charge.create をキャンセルする手段があればそうするのでしょう。
「③Payjp::Charge.createで問題が発生した場合はこの記述でデータの一貫性が保たれる」
かどうか。 あなたのシステム内では整合しているかもしれませんが、Payjpに対しては支払処理が行われているので、それを含めると「整合している」とは言いがたいです

投稿2020/10/28 04:10

winterboum

総合スコア23284

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

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

tomtomtomtom

2020/11/15 12:35

ご返答ありがとうございました^^ もう少しトランザクションを勉強します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問