gpt4 book ai didi

javascript - 数据库事务并行发生,而不是循环中顺序发生

转载 作者:太空宇宙 更新时间:2023-11-03 23:12:05 24 4
gpt4 key购买 nike

我有一个端点,它循环遍历数组并更新数据库,如下所示。

 app.post('/create', Authenticate, async (req, res) => {
const {
products,
} = req.body;
const trxProvider = knex.transactionProvider();
const trx = await trxProvider();

try {
const formattedProduct = await Promise.all(products.map(async (product) => {

// Get Current value
const warehouseProducts = await trx('warehouse_products')
.select('available_qty as qty')
.where('product_code', product.product.code)
.first();

const finalQty = warehouseProducts.qty - product.orderQty;

// Update database
await trx('warehouse_products')
.update({ available_qty: finalQty })
.where('product_code', product.product.code);
}));
await trx('ordered_products')
.insert(formattedProduct);
trx.commit();
console.log('Transaction successful');
return send(res, 201, { success: true });
} catch (err) {
console.log(err);
trx.rollback();
const errors = {};
errors.message = 'something went wrong';
return send(res, 500, errors);
}
});

当我尝试在循环内更新warehouse_products 表的同一行时,就会出现问题。在循环中,最初从特定产品的warehouse_products 表中获取qty 值,然后完成算术运算并更新qty 值。

理想情况下,如果两个迭代都访问同一行,则第二次迭代的初始数量值应该是第一次迭代更新的值。然而问题是第二次迭代也从第一次迭代的初始值开始。这几乎就像两个迭代是并行发生的,而不是顺序发生的。

最佳答案

由于您使用的是Promise.all,因此它应该并行发生。对于顺序处理更改此代码

await Promise.all(products.map(async (product) => {
// logic here
});

for(const product of products) {
// logic here
}

关于javascript - 数据库事务并行发生,而不是循环中顺序发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59964338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com