Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 平均竞争条件_Javascript_Node.js_Race Condition_Mean Stack - Fatal编程技术网

Javascript 平均竞争条件

Javascript 平均竞争条件,javascript,node.js,race-condition,mean-stack,Javascript,Node.js,Race Condition,Mean Stack,根据下面的反馈,我已将此问题更新为更具体的问题 如果两个用户都发出一个HTTP请求,执行以下操作:读取记录,根据业务逻辑对记录进行一些更改,然后写回数据库,那么在平均堆栈应用程序中是否可能存在竞争条件?还是因为单线程的JS执行环境而无法实现?根据下面的一些评论,这听起来像是个问题。是否有实现事务的方法?或者我需要创建一个作业队列,或者使用基于参与者的方法。我试图理解这类问题通常是如何用平均堆栈来解决的 好的,我来回答你问题中较窄的部分。Node.js确实为JavaScript引擎提供了一个线程,

根据下面的反馈,我已将此问题更新为更具体的问题


如果两个用户都发出一个HTTP请求,执行以下操作:读取记录,根据业务逻辑对记录进行一些更改,然后写回数据库,那么在平均堆栈应用程序中是否可能存在竞争条件?还是因为单线程的JS执行环境而无法实现?根据下面的一些评论,这听起来像是个问题。是否有实现事务的方法?或者我需要创建一个作业队列,或者使用基于参与者的方法。我试图理解这类问题通常是如何用平均堆栈来解决的

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

看这里:


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

我实际上更多地是从节点JS的角度来问这个问题。我给出了一个具体的例子,其中两个用户发出一个HTTP请求,该请求将读取、修改和写入文档。@Adematini问题是,node.js从不写入文档,这是由第三方api或服务(如数据库或文件系统)完成的。同样的情况也适用。虽然node.js不会同时发送两次写入,但如果您不小心的话,它会在第一次写入之前发送第二次写入。我认为这是一个有效的问题,为什么要进行否决?问这个给定节点的咒语它是单线程的是有意义的。好吧,当你说“根据业务逻辑更改记录”时,该逻辑具有绝对最新的值是重要的,还是1s前的值是可以接受的?当您写回DB时,存储在那里的值是最新操作的结果而不是前一秒发生的结果有多重要?如果你能描述一下你真正在做什么,这会有所帮助。“它可以很好地询问它的两个线程”我不认为node.js本身会产生线程,相反,它会向第三方进程(一个数据库)发出请求,这可能会使用多个线程。不,node.js本身使用线程,只是不用于评估JavaScript。您可以配置它将产生多少个帮助线程,因此我想您可以将它设置为一个以避免并发。@Touffy此链接实际上并没有完全回答我的问题。我真的更关心的是我想阅读的情况,做出一些关于改变什么的决定,然后在记录中写一些改变。因此,发生了多个操作。如果多个用户可以并行地执行此操作,那么听起来这是一个问题。是否有实现事务的方法?或者我需要创建一个作业队列,或者使用基于参与者的方法。我正在试图理解这类问题通常是如何用平均值堆栈来解决的。@Touffy根据您的建议,我已将问题修改为更具体的问题。