我对网络开发很陌生.从我所看到的种族条件我想到的节点或JS它们是不可能的,因为它是单线程的,但我看到的是......我猜错了.有了这个小例子,有人可以解释它是如何工作的.
如果有一个1000美元的银行账户,两个人在完全相同的时间向该账户收取费用.第一人收费600美元,第二人收费200美元.
第一笔费用为1000美元 - 600美元,余额为400美元.但是,由于第二次充电同时达到1000美元 - 200美元,余额为800美元.显然,现在的余额应该是200美元.
根据我的理解会导致竞争条件,不是吗?您如何设置它以避免此问题?我不需要确切的代码,也许有人向我解释这个,或伪代码.
提前致谢.
编辑:我将编辑它最初如何设置代码导致竞争条件.
就像下面的帖子说的那样.代码将被设置为当帐户被点击时,它将减去金额并给出新的余额.显然这会导致比赛状况.
如果没有看到使用的确切代码,则无法专门回答您的示例,因为有安全的方法来编写代码和不安全的编写方法.
node.js是单线程的,但只要请求发出异步调用,就会在执行异步请求时运行其他请求.因此,您可以同时在飞行中有多个请求.这是否会导致"竞争条件"完全取决于您编写代码的方式,在特定情况下,还取决于您如何访问数据库.
如果你编写这样的代码(伪代码):
get total from database subtract from total write new total to database
并且,对数据库的调用是异步的(它们很可能是),然后你肯定会遇到竞争条件,因为在你获得总数和写入总数之间,其他请求可能试图访问相同的总值并尝试修改它,一个请求将不具有最新的总值,或者两个将踩对方的结果(一个覆盖另一个).
另一方面,如果您有一个可以对数据库中的总值进行原子修改的数据库,如下所示:
subtract x from total in database
然后,您将受到保护,免受特定的竞争条件.
因为node.js是单线程的,所以在node.js中编写安全代码并不像在多线程Web服务器中那样复杂.这是因为Javascript只有一条路径同时执行.因此,在进行某种异步I/O调用之前,其他任何请求都不会同时运行.这使得访问node.js应用程序中的共享变量比在真正的多线程Web服务器环境中更加简单,其中对共享变量的任何访问都必须受到互斥锁(或类似的东西)的保护.但是,只要您进行异步调用,就必须意识到在那个时间点,其他请求可以运行.