我想从一组不同的表中收集信息,并将结果展平。
await Promise.all(entities.map(async dbRow => {
let detailedInfo = await loadDetailedInfo(datePeriod, dbRow.field);
if (!detailedInfo)
return console.log("Processed field:", dbRow.field, ++counter + '/' + entities.length, "No detailed info");
let promiseArray = detailedInfo.map(field_tier1 => {
if (!field_tier1 || !field_tier1.data)
return;
return field_tier1.data.map(async field_tier2 => {
if (!field_tier2 || !field_tier2.data)
return;
return new Promise(resolve => {
resolve([
...
somedata
...
]);
})
})
});
promiseArray = flatten(promiseArray);
return Promise.all(promiseArray)
.then(async (flattenedArray) => {
if (flattenedArray.length) {
console.log('Processed entity:', dbRow.field, ++counter + '/' + entities.length);
await saveFlattenedData(flattenedArray);
} else
console.log('Processed entity:', dbRow.field, ++counter + '/' + entities.length, "No data");
})
}))
这行很好,除了这一行
await saveFlattenedData(flattenedArray)
方法如下
let query = `INSERT INTO dataTable
(..., field, ...)
VALUES ?
ON DUPLICATE KEY UPDATE
field1 = VALUES(field1)
...
fieldn = VALUES(fieldn)`;
return db.executeQueryAsync(query, [flattenedData]);
由于某种原因,用于Node.js的MySql库会保留所有插入查询,直到实体中的所有记录准备就绪并且可能有很多记录为止(准备过程最多可能需要30分钟)。之后,它会立即引发所有查询,这会导致较高的数据库负载以及主要问题是死锁。
确切的错误是:“ ER_LOCK_DEADLOCK:尝试获取锁时发现了死锁;尝试重新启动事务”
您能指出我进行调查的正确方法吗?