ROR中的数据库安全并发

时间:2011-10-24 20:04:39

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

试图弄清楚如何在Ruby On Rails中处理并发性。

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

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

2 个答案:

答案 0 :(得分:5)

您想查看ActiveRecord TransactionsPessimistic Locking

Account.transaction do
  account = Account.find(account_id)
  account.lock!

  if account.balance >= 100
    account.balance -= 100
    account.save
  end
end

答案 1 :(得分:1)

是的,你有办法在Rails中实现一个事务。一个例子:

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

更多信息here