问题描述:
举个例子,比如买票,数据库中只有一张票了,现在两个人同时购买这张票,请问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。