ホームページ  >  に質問  >  本文

node.js - nodejs单进程产生的数据库连接多线程并发问题探讨

举例,假设有100个请求node服务器,每个请求会执行一次查询,修改数据库操作。假设10个请求按顺序被node接收处理 等待各自判定库存查询数据库io操作,但是库存只有5个,问题来了,这时候10个查询都判定库存还有,然后继续下面的下单操作。当100个请求甚至更多时,问题会被更加放大 又不能同步加锁,哪位朋友有比较合理的思路 不吝赐教~

怪我咯怪我咯2742日前915

全員に返信(4)返信します

  • 高洛峰

    高洛峰2017-04-17 15:52:35

    サイトで「snap up」を検索
    https://segmentfault.com/sear...

    極端なケースは「フラッシュセール」です
    https://segmentfault.com/sear...

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:52:35

    この場合、トランザクションを追加する必要があります

    ----- 回答を更新します -----

    クエリと実際のデータの不一致の問題は避けられませんが、私の理解では、コールバックを更新する前に他のユーザーが購入に成功した場合、購入失敗の問題が発生するため、実際にはロックすることで解決できます。 , すべての非同期操作で Promise を使用する場合、Promise を介して連続呼び出しをシミュレートして、Java メソッドのロックと同様の機能を実現できます

    デコレータを使用して、Promise を返すメソッドの Java synchronized キーワードと同様の同期呼び出しを実装します

    リーリー

    Chrome で実行するとパスします。 。

    ----- 再度更新 ----

    github にはすでに同様のツールがあります
    https://github.com/sindresorh...

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 15:52:35

    上記の 2 人に感謝します。まず、私が説明したシナリオは通常の商品販売の場合です。これは、redis キューを使用することで直接解決できます。製品の種類が多い場合、この方法はお勧めできません。

    リーリー

    返事
    0
  • 阿神

    阿神2017-04-17 15:52:35

    トランザクション + 条件付き更新は、設計により過剰販売を回避します。

    返事
    0
  • キャンセル返事