javascript - 一个 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);
}
};
解决方案
推荐阅读
- algorithm - 给定一棵树,计算这棵树中的最长路径,其路径中的节点具有相同的设置位
- java - 尝试在空对象引用上调用虚拟方法。数组列表
- wordpress - 为什么结帐页面上的点击事件不起作用?
- json - 如何在 kotlin 中将 Json 数据解析为 tablayout?
- sql - 如何在 oracle 的功能索引中创建分区?
- c# - 使用给定的测试套件找出在 C# 源代码中执行的行(获取代码覆盖率)
- python - 使用 imshow 绘制单通道图像(例如灰度)时出现问题
- r - 将大列表转换为一列包含所有元素的小标题
- node.js - 在不使用数据库的情况下为服务编写单元测试
- python - Pytorch中[-1,0]的维度范围是多少?