【发布时间】:2020-06-03 09:52:24
【问题描述】:
我使用 nodejs (AdonisJs) 创建一个脚本来更新我的数据库 (Mysql)。像这样的:
const trx = await Database.beginTransaction();
try {
const async = use('async');
await async.eachOfLimit(arr, 50, async item => {
`select * from table1 where id = 1 LOCK IN SHARE MODE`
`insert into ....`
`another query...`
});
trx.commit();
} catch (err) {
trx.rollback();
}
问题是eachOfLimit 并行运行查询,所以上面的代码抛出错误:Deadlock found when trying to get lock; try restarting transaction。如果我使用for of 同步循环运行它,它工作正常。
如何为我的脚本解决这个问题或任何想法。对不起我的英语不好。
顺便说一句,我使用LOCK IN SHARE MODE 或FOR UPDATE 来避免在许多查询INSERT 运行时重复,即使我使用findOrCreate 检查行是否存在
【问题讨论】:
标签: mysql node.js async-await transactions deadlock