Предостережения, связанные с транзакциями для приложений многопоточных рельсов, которые могут помешать сохранению данных - PullRequest
0 голосов
/ 24 апреля 2019

Я столкнулся с проблемой, которая, кажется, может быть связана с вложенными транзакциями, чтобы попытаться избавиться от идеи, что это может быть некоторая странность, связанная с транзакциями, о которых я не знаю, я хотел бы знать, их предостережения, которые могут помешать успешному завершению транзакции или привести к невозможности сохранения данных без появления ошибки?

примечания:

  • У нас есть типовая транзакция внутри ActiveRecord::Base транзакции
  • все наши тесты проходят без проблем, проблема только возникает в производстве
  • Никаких исключений не возникает, и весь код транзакции выполняется нормально, включая действия, связанные с БД
  • в данном примере данные, которые не удалось сохранить, находятся в блоке User.transaction
  • Бегаем по пуме
  • Мы используем postgresql
  • используем герою

Пример: * * тысяча двадцать-пять

payment.rb

class Payment < ApplicationRecord
  belongs_to :payer, class_name: 'User'
  belongs_to :recipient, class_name: 'User'

  def apply_user_balances!
    User.transaction do
      payer.lock!
      recipient.lock!
      payer.credit += amount
      recipient.credit -= amount
      payer.save!
      recipient.save!
    end
  end
end

payment_service.rb

class PaymentService
  def self.apply_payment(payment)
    ActiveRecord::Base.transaction do
      payment.apply_user_balances!
    end
  end
end
...