2017年7月22日 星期六

在 rails 內避免數字因為 race condition 而有誤


例如我有個 Account model 內有 balance column,可以這樣做:



```ruby
  def increment_balance(amount)
    self.class.connection.execute "update accounts set balance = balance + #{amount} where id = #{id}"
    add_to_transaction # so after_commit will be triggered
    self
  end
```

這樣就算我有兩個 account instance 同時存入也沒關係,因為他增加的值是從 database 的值去加的,如果是用

```ruby
account.update(amount: new_amount)
```

這種作法的話就會變成直接 update 成新的值,就可能會有 race condition 的問題

沒有留言:

張貼留言