node.js - 关系数据库的排队系统并发问题
问题描述
大家好,我正在开发一个 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
};
解决方案
推荐阅读
- python - 将列表列表的字符串转换为 Numpy 数组
- mysql - 在重复键更新多个值MYSQL
- codenameone - 代号一:理解JDK23升级到JDK27后的warnings和SecurityException
- javascript - ReferenceError:用户未定义错误
- c# - Web API 向浏览器返回 HttpResponseMessage 的描述
- javascript - 如何使用 JavaScript 获取 textarea 标签中提供的输入?
- powershell - 类似 :? 的 PowerShell 语法 操作员?
- sql - 在顶级json数组oracle中搜索元素
- python - 在 pandas 数据框中折叠带有 NaN 条目的行
- mysql - SQL - 根据其他表中的数据从表中选择项目?