0

我计划将我的 Rails 应用程序扩展到多个实例,但它们仍将使用相同的数据库。如果两个用户最终使用应用程序的两个不同实例,编辑同一个帐户,那么这肯定会在某个地方引起竞争条件 - 鉴于这是一个 Rails 应用程序,防止这种情况的最佳方法是什么?

我所知道的唯一与数据库相关的设置允许指定实际服务器 IP。如果一个程序可以以某种方式成为中间人,它将解决问题......否则应用程序实例将不得不以某种方式相互通信,对吗?

除非有办法使用 Postgres 中的设置来解决这个问题......

任何帮助,将不胜感激!!谢谢!

4

1 回答 1

0

我建议实施乐观锁定策略。Rails 开箱即用地支持这一点。为此编写一个成熟的教程超出了stackoverflow答案的范围。请在线查找详细说明。

基础是: 对于您要保护的每个模型,您需要添加一个整数列,调用lock_version该模型的数据库表。另外,在每个表单中,您都需要添加一个带有此 lock_version 的隐藏字段。如果您使用安全参数,当然允许控制器中的 lock_version 参数。

每当您保存记录并且存在 lock_version 时,Rails 将确保 lock_version 与数据库中的匹配。如果它们不匹配,这意味着在此期间发生了另一个更新,并且当前更新失败并带有StaleObjectError.

作为一种后备策略,我建议您向更新被拒绝的用户显示一条消息。此外,使用数据库中的当前值(不是尝试的输入,因为您希望用户重新考虑他们的更改是否合适)再次呈现他们正在填写的相同表单。

(您可以通过rescue_from在您的ApplicationController.

于 2016-06-25T23:54:12.353 回答