使用Promise.all()时,我们可以执行很多MySQL查询吗?

时间:2019-04-15 21:28:01

标签: node.js

我想从一组不同的表中收集信息,并将结果展平。

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:尝试获取锁时发现了死锁;尝试重新启动事务”

您能指出我进行调查的正确方法吗?

0 个答案:

没有答案