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