【问题标题】:Database-safe Concurrency in RORROR 中的数据库安全并发
【发布时间】:2011-10-24 20:04:39
【问题描述】:

试图弄清楚 Ruby On Rails 是如何处理并发的。

如何获取一段代码来锁定数据库中的行并在需要时强制回滚?

更具体地说,有没有办法强制某段代码完全完成,如果不回滚?我希望在我的项目中添加历史记录,但我不想要在不保存历史记录的情况下提交事务,因此如果服务器介于两个操作(保存事务和保存历史记录)之间,数据库可能会进入非法状态。

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3 concurrency


    【解决方案1】:

    你想看看ActiveRecord TransactionsPessimistic Locking

    Account.transaction do
      account = Account.find(account_id)
      account.lock!
    
      if account.balance >= 100
        account.balance -= 100
        account.save
      end
    end
    

    【讨论】:

    • 数据库上的if语句也可以在事务中完成吗?
    • 任何你想要的东西都可以放在事务块中,所以是的,如果语句可以完成。
    • 如果到最后 if 会因为从不同的事务发生变化而失败?
    • 事务将确保您的操作以原子方式发生,而不管其他地方更改了哪些数据。
    • 太棒了!聊天是我不小心点击了一个链接。
    【解决方案2】:

    是的,您有一种在 Rails 中实现事务的方法。一个例子:

    YourModel.transaction do
      rec1.save!
      rec2.save!
    end
    

    更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多