首页 > 解决方案 > 一个 Express 控制器中的多个 SQL 事务

问题描述

我遇到了以下问题:

我们有表格“Order”和“OrderPosition”以及“Cart”和“CartPosition”。每当执行订单时,应创建一个新订单,应将所有 CartPosition 插入 OrderPosition 并删除所有 CartPosition。

我的代码有点工作,但 SQL 事务耗时太长,因此无法确保数据完整性。例如,有时同一项目被插入表 Order 2 或 3 次,因为 delete-transaction 花费的时间太长。

我的代码是:

exports.order = async (req, res) => {
    const {CartID} = req.body;
    try {
        var cartInformationen = await db
            .promise()
            .query(
                `SELECT Dienstleister_ohne_TVID, PatientID FROM Cart WHERE CartID = '${CartID}'`
            );
        db.query(
            `INSERT INTO Order (Dienstleister_ohne_TVID, PatientID, created_on) VALUES ('${cartInformationen[0][0].Dienstleister_ohne_TVID}', '${cartInformationen[0][0].PatientID}', current_timestamp())`
            );

        var OrderID = await db
            .promise()
            .query(
                `SELECT MAX(orderID) AS orderID FROM Order WHERE Dienstleister_ohne_TVID = '${cartInformationen[0][0].Dienstleister_ohne_TVID}' AND PatientID = '${cartInformationen[0][0].PatientID}'`
            );
        
            do {
                var cartPositionInformationen = await db
                .promise()
                .query(
                    `SELECT MIN(ArtikelID) AS ArtikelID, OrderQuantity FROM cartposition WHERE cartID = '${cartID}'`
                );
                db.promise().query(
                    `DELETE FROM cartposition WHERE cartID = '${cartID}' AND ArtikelID = '${cartPositionInformationen[0][0].ArtikelID}';`
                );

                db.query(
                    `INSERT INTO Orderposition (ArtikelID, orderID, quantity) VALUES ('${cartPositionInformationen[0][0].ArtikelID}', '1', '${cartPositionInformationen[0][0].OrderQuantity}') `
                );
                var nextArtikelID = await db
                    .promise()
                    .query(
                        `SELECT MIN(ArtikelID) AS ArtikelID FROM cartPosition WHERE cartID = '${cartID}'`
                    );
                    console.log("nextArtikelID " + nextArtikelID[0][0].ArtikelID);
            }
            while (nextArtikelID[0][0].ArtikelID != null)
            res.status(200).send("Order was sent.");
    } catch (err) {
        console.log(err);
        res
          .status(400)
          .send({ msg: "Order could not be executed." });
        console.log(err);
    }
};

标签: javascriptmysqlexpress

解决方案


推荐阅读