问题描述:
举个例子,比如买票,数据库中只有一张票了,现在两个人同时购买这张票,请问nodejs是如何处理的?有人说,nodejs是单线程,不会产生此问题。那如果是利用多核多线程呢?或N台服务器,m个线程同时请求这个资源呢?感谢!
PHPz2017-04-17 13:20:46
这个问题有可能会在买每一张票的时候发生,而不仅是最后一张票。另外,Node.js 是单线程处理,所以单机服务不会发生类似的问题,就算是多核也不会发生。不过如果有N台服务器在跑使用同一个数据库中的数据,这是多个进程在竞争资源。
如果想简单的解决此类问题,给表加锁。如果希望高效一点处理此类问题,需要加一些缓存,如果是高并发的情况,需要在缓存层做一些初步的筛选。
巴扎黑2017-04-17 13:20:46
数据是在数据库中,高并发下的正确要依靠数据库来解决,比如使用乐观锁,给数据加版本号。
select version,data from table;
update table set data = 1,version = version + 1 where version = X
根据update返回的affectedRows判断是否成功,再吐给前端结果。
node 本身只是做一个请求处理和数据库命令的转发,一般都是异步回调实现,单进程下也是可以并发多个相同的请求到数据库,一般不会使用阻塞的方式去请求DB。