Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails嵌套事务_Ruby On Rails_Database_Postgresql_Ruby On Rails 4_Transactions - Fatal编程技术网

Ruby on rails Rails嵌套事务

Ruby on rails Rails嵌套事务,ruby-on-rails,database,postgresql,ruby-on-rails-4,transactions,Ruby On Rails,Database,Postgresql,Ruby On Rails 4,Transactions,我正在尝试制作rails应用程序,我遇到了这个问题。 我有嵌套的事务,我认为它们一直在工作。但是,我发现它们不能正常工作 这是用户服务 class UserService def self.reduce_balance!(user, delta, attachmentable) ActiveRecord::Base.transaction do user.balance.amount -= delta balance_decrease

我正在尝试制作rails应用程序,我遇到了这个问题。 我有嵌套的事务,我认为它们一直在工作。但是,我发现它们不能正常工作

这是用户服务

    class UserService
    def self.reduce_balance!(user, delta, attachmentable)
      ActiveRecord::Base.transaction do
        user.balance.amount -= delta
        balance_decrease = BalanceDecrease.new(user: user, attachmentable: attachmentable, balance_before: user.balance.amount_was, amount: delta)
        user.balance.save!
        balance_decrease.save!
      end
      return true
    end
    end
有游戏服务

    class GameService
      def self.take_spot(user, spot)
        if UserService.have_enough_money? user, game.spot_price
          begin
            ActiveRecord::Base.transaction do
              spot.free = false
              spot.user = user
              spot.save!
              UserService.reduce_balance!(user, game.spot_price, spot)
              return res = {success: true, json: spot, status: 200}
            end
          rescue => e
            return res = {json: {error: 1, error_message: "Something gone wrong"}, status: 500}
          end
        else
          return res = {json: {error: 1, error_message: "You don't have enough money"}, status: 400}
        end
      end
    end
我有我的控制器,它是

    def update
      @res = GameService.take_spot current_user, @spot
      return render json: @res[:json], status: @res[:status] unless @res[:success]
    end
不知何故,1700个查询中有1个出现了问题:现货已经买入,余额并没有减少

json文件(下面有它的图片):


我有10美元的海洋水滴。可能是问题吗?

ActiveRecord::Rollback
不会在包含的事务块之外传播,因此父事务不会接收嵌套在子事务中的异常

要确保父事务收到回滚,必须向子事务添加
requires\u new:true
选项

查看并获取更多详细信息

因此,将其应用到您的案例中,您应该拥有如下
user\u service.rb

class UserService
  def self.reduce_balance!(user, delta, attachmentable)
    ActiveRecord::Base.transaction(requires_new: true) do
      # code omitted
    end
  end
end

您的问题源于您使用事务的方式

无论何时嵌套它们,都必须使用
requires\u new:true

ActiveRecord::Base.transaction do 
  ActiveRecord::Base.transaction(requires_new: true) do 

  end
end
它解释得很好

顺便说一句,总是使用
requires\u new:true
并没有什么坏处


旁注,您似乎在使用服务对象并链接它们,也许

ActiveRecord::Base.transaction do 
  ActiveRecord::Base.transaction(requires_new: true) do 

  end
end