首页 > 解决方案 > 关系数据库的排队系统并发问题

问题描述

大家好,我正在开发一个 nodejs 脚本来管理作业。我有一个启动以下事务的函数:

    const globalTask = () => {
      await startTransaction();
      const job = await sql(`SELECT * FROM "jobs" WHERE "state"='WAITING' LIMIT 1 FOR UPDATE 
                             IGNORE LOCKED`);
      if (job) {
           await sql(`UPDATE "jobs" SET "state"='PENDING' WHERE "id"=${job[0].id}`);
      }
      await this.commit();
      if (!job) return;
      
      // other phases...
      // here the job is processed....
   };

然后我有一个“主”函数,它使用 Promise.all 启动 10 次 globalTask​​() 函数。不幸的是,有时我会收到一条异常消息“事务因检测到死锁而回滚:TrexColumnUpdate 在表上失败”作业“或者我注意到一个或多个行已被多次选择。我应该如何更改 sql 命令?我的数据库使用的是 SAP HANA。

const main = async () => {
    const results = await Promise.all([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(_ => globalTask())); 

   // business logic
};

标签: node.jsconcurrencyqueuehanadatabase-deadlocks

解决方案


推荐阅读