【问题标题】:MEAN JS DB Race ConditionsMEAN JS DB 竞赛条件
【发布时间】:2015-04-14 00:53:11
【问题描述】:

我根据以下反馈更新了这个问题,使其更加具体

如果两个用户都发出执行以下操作的 HTTP 请求,MEAN 堆栈应用程序中是否可能存在竞争条件:读取记录,根据业务逻辑对记录进行一些更改,然后写回D B?还是因为单线程JS执行环境不可能?根据下面的一些 cmets,这听起来像是一个问题。有没有办法实现交易?或者,也许我需要创建一个作业队列或使用基于参与者的方法。我试图了解这种类型的问题通常是如何使用 MEAN 堆栈解决的。

【问题讨论】:

  • 我实际上更多地在 Node JS 方面提出这个问题。我举了一个具体的例子,其中两个用户发出一个 HTTP 请求,该请求将读取、修改和写入文档。
  • @ademartini 问题是,node.js 从不写入文档,这是由第三方 api 或服务(例如数据库或文件系统)完成的。同样的事情也适用。虽然 node.js 不会同时发送两次写入,但如果您不小心,它会在第一次完成之前发送第二次写入。
  • 我认为这是一个有效的问题,为什么要投反对票?考虑到 Node 的口头禅,它是单线程的,这是有道理的。
  • 好的,当您说“根据业务逻辑更改记录”时,该逻辑具有 绝对最新 值是否重要,还是 1 秒前的值?可以接受吗?当您写回数据库时,存储在那里的值是 latest 操作的结果而不是之前发生的操作有多重要?如果你能描述你真正在做什么会有所帮助。

标签: javascript node.js race-condition mean-stack


【解决方案1】:

好的,我会回答你问题的狭义部分。 Node.js 确实为 JavaScript 引擎提供了一个线程,但它使用多个线程来处理异步操作,例如……数据库(和其他)I/O。它可以很好地要求它的两个线程连接到数据库以同时编辑同一个文档。

看这里:Does node.js use threads/thread pool internally?

所以不,Node 不会让您免于异步操作的竞争条件。 MongoDB 在某种程度上确实如此(您确实应该阅读文档,因为它是一个复杂的主题)。

【讨论】:

  • “它可以很好地询问它的两个线程” 我不认为 node.js 本身会产生线程,而是它会向第 3 方发出请求可能使用多个线程的进程(数据库)。
  • 不,node.js 本身使用线程,只是不用于评估 JavaScript。您可以配置它将生成多少个辅助线程,所以我想您可以将其设置为一个以避免并发。
  • @Touffy 这个链接实际上并没有完全回答我的问题。我真的更关心我想阅读的情况,对要更改的内容做出一些决定,然后将一些更改写入记录。所以有多个操作发生。如果多个用户可以并行执行此操作,这听起来像是一个问题。有没有办法实现交易?或者,也许我需要创建一个作业队列或使用基于参与者的方法。我试图了解这种类型的问题通常是如何使用 MEAN 堆栈解决的。
  • @Touffy 根据您的建议,我已将问题修改得更具体。
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 2013-02-17
  • 2022-11-10
  • 2012-06-09
  • 2018-04-15
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多