[ruby on rails] transactionとpayjpを使用してデータの一貫性を保ちたい。
Q&A
Closed
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点になります。
自身で様々なサイトを参考にして書き上げました。
問題点などありましたらご指摘いただきますと幸いです。
それでは宜しくお願いいたします。
0