Javascript 如何处理比赛情况

Javascript 如何处理比赛情况,javascript,node.js,race-condition,single-threaded,Javascript,Node.js,Race Condition,Single Threaded,我对网络开发相当陌生。从我读到的竞争条件来看,我认为node或JS是不可能的,因为它是单线程的,但我看到了。。我猜错了。通过这个小例子,有人可以解释它是如何工作的 如果有一个1000美元的银行账户,两个人在同一秒向账户收费,同时点击服务器。第一人收费600美元,第二人收费200美元 第一笔费用为1000-600美元,余额为400美元。 但是,由于第二次充电正好在同一时间发生,它将花费1000-200美元,剩下的余额为800美元。显然,现在的余额应该是200美元 据我所知,这会导致比赛状态,不是吗

我对网络开发相当陌生。从我读到的竞争条件来看,我认为node或JS是不可能的,因为它是单线程的,但我看到了。。我猜错了。通过这个小例子,有人可以解释它是如何工作的

如果有一个1000美元的银行账户,两个人在同一秒向账户收费,同时点击服务器。第一人收费600美元,第二人收费200美元

第一笔费用为1000-600美元,余额为400美元。 但是,由于第二次充电正好在同一时间发生,它将花费1000-200美元,剩下的余额为800美元。显然,现在的余额应该是200美元

据我所知,这会导致比赛状态,不是吗?您将如何设置此选项以避免此问题?我不需要精确的代码,也许有人能给我解释一下,或者伪代码

提前谢谢

编辑:我将编辑它,了解如何设置最初导致竞争条件的代码


就像下面的帖子说的。该代码将被设置为,当账户被点击时,它将减去金额并给出新的余额。很明显,这会导致竞争状况。

如果没有看到使用的确切代码,就无法具体回答您的示例,因为有安全的方法编写代码,也有不安全的方法编写代码

node.js是单线程的,但只要请求发出异步调用,其他请求就可以在执行该异步请求时运行。因此,您可以同时处理多个请求。这是否会导致“竞争条件”完全取决于您如何编写代码,以及在特定情况下如何访问数据库

如果您编写这样的代码(伪代码):

而且,对数据库的调用是异步的(它们很可能是异步的),那么您肯定有一个竞争条件,因为在获取总数和写入总数之间,其他请求可能试图访问相同的总值并试图修改它,其中一个请求可能没有最新的总值,或者两个请求将互相践踏对方的结果(一个覆盖另一个)

另一方面,如果您的数据库可以对数据库中的总值进行原子修改,如中所示:

subtract x from total in database
然后,您将受到保护,免受该特定竞赛条件的影响



因为node.js是单线程的,所以在node.js中编写安全代码不像在多线程web服务器中那样复杂。这是因为同一时间只有一条Javascript执行路径。因此,在进行某种异步I/O调用之前,不会有其他请求同时运行。这使得在node.js应用程序中访问共享变量比在真正的多线程web服务器环境中要简单得多,在这种环境中,对共享变量的任何访问都必须受到互斥锁(或类似的东西)的保护。但是,当您进行异步调用时,您必须知道,在该时间点,其他请求可以运行。

当然,如果您有2$600的传输,您可能会遇到另一个问题,即余额现在为负值。您能否解释一下可以进行原子修改的数据库,或者提供阅读材料?@jscript noob-这是sql的主要功能之一(您可以编写在服务器上以原子方式运行的逻辑)。有关信息,请参阅。否则,您可能必须获取数据库某些部分的锁,如:获取锁、读取、修改、写入、解锁。还值得一读:你需要考虑你正在使用的数据库以及如何编码SQL语句。请参阅以下(上一个)答案:那么MongoDB数据库对这类事情不好吗?
subtract x from total in database