在ROR中实现数据库安全并发性

5

我正在尝试弄清楚 Ruby On Rails 中如何处理并发。

如何使代码段锁定数据库中的行,并在需要时强制回滚?

更具体地说,是否有一种方式可以强制某个代码段完全完成,如果未能完成则回滚? 我想在我的项目中添加事务历史记录,我不希望事务在保存历史记录之前提交,因此如果服务器在这两个操作(保存事务和保存历史记录)之间崩溃,数据库可能会进入非法状态。

2个回答

5
您想了解ActiveRecord事务悲观锁定
Account.transaction do
  account = Account.find(account_id)
  account.lock!

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

数据库中的if语句是否也可以在事务中执行? - Nachshon Schwartz
不确定你是否理解我的问题,如果我想在取款之前检查一下银行账户里是否有钱,然后在我检查之后别人取了钱,接着我再去取款,这可能会让我处于非法状态...我该如何防止这种情况发生? - Nachshon Schwartz
啊。在检查余额并进行必要的取款之前,您应该锁定表中相关的行。我已经更新了我的答案,并提供了一个示例和悲观锁定文档的链接。 - Douglas F Shearer
让我们在聊天室中继续这个讨论 - Douglas F Shearer
1
太好了!聊天是我不小心点击链接的结果。 - Douglas F Shearer
显示剩余3条评论

1

是的,您可以在Rails中实现事务的方式。一个例子:

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

更多信息在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接