【问题标题】:Avoiding race condition for inserting model to DB on complex conditions避免在复杂条件下将模型插入数据库的竞争条件
【发布时间】:2017-02-10 22:58:47
【问题描述】:

我们正在尝试创建一种算法/启发式方法,将在某个时间段安排交付,但这里肯定存在竞争条件,即两个冲突的计划项目可能会写入数据库,因为写入不是真的原子的。

真正防止竞争条件的唯一方法是创建一些原子插入操作,TMK。

服务器接收到在某个时间段内安排某事的请求,并且服务器必须在将数据写入数据库之前检查该时间段是否仍然可用。但是在那个时候,服务器可能会收到类似的请求并最终写入冲突的数据。

如何规避这个问题?有没有办法在数据库本身中创建一些脚本来挂钩写入操作以使整个事情原子化?通过在该脚本上设置锁定机制?使整个事情变得非原子的是服务器和数据库之间的读取和连接时间。

【问题讨论】:

  • 听起来您在使特定代码工作时遇到问题。在这种情况下,如果您发布 minimum code that reproduces the problem,我们会更有帮助。
  • 这个问题可能属于programmers.stackexchange?

标签: node.js firebase firebase-realtime-database race-condition nosql


【解决方案1】:

每当我遇到竞态条件时,我都会想到一个直接的解决方案 QUEUE。

第 1 步)您可以做的不是直接将数据添加到数据库中,而是可以将其添加到队列中而无需检查任何内容。

第 2 步)一个单独的读取器将从队列检查数据库中读取任何冲突并采取必要的措施。

这是解决此问题的方法之一如果您实施任何更好的解决方案,请分享。

希望对你有帮助

【讨论】:

  • 感谢您的回答,我实际上不确定这如何解决问题。 (1) 同一个队列中的两个工作人员可以在短时间内收到类似的请求,(2) 两个工作人员都可以从数据库中读取,并且看到写入正常,(3) 两个工作人员都写入一个收集并有效地导致高级数据冲突。
  • 避免上述情况的唯一方法是,如果写入本身 (3) 是数据库中的原子操作。问题是我们数据库中的写入不是原子的,它取决于更多的条件,而不仅仅是数据库中的单个字段或其他什么。
  • 您能否更准确地描述队列将如何解决问题?谢谢!
  • 我怀疑你可以有多个阅读器,只有一个阅读器会从队列中读取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2010-09-25
  • 2010-09-25
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多