У меня есть функция, которая принимает объект, некоторые свойства которого являются массивами, и выполняет серию SQL-запросов в качестве транзакции:
createOrder_transaction: async (order, orderItems, orderPayments) => {
const transaction = await scSqlPool.transaction();
await transaction.begin();
try {
const request = transaction.request();
await request.query`INSERT INTO [TillOrders]
(orderId, teamName, tillId, orderNo, total, paymentType, date)
VALUES (${order.orderId}, ${order.teamName}, ${order.tillId}, ${order.orderNo}, ${order.total}, ${order.paymentType}, ${new Date(order.date)})`;
for (let item of orderItems) {
await request.query`INSERT INTO [TillOrderItems]
(orderId, itemNo, vCode, qty, totalPrice, price, oldPrice, appliedDiscountNo)
VALUES (${order.orderId}, ${item.itemNo}, ${item.vCode || ""}, ${item.qty}, ${item.totalPrice}, ${item.price}, ${item.oldPrice}, ${item.appliedDiscountNo})`;
}
for (let payment of orderPayments) {
await request.query`INSERT INTO [TillOrderPayments]
(orderId, type, value, notes)
VALUES (${order.orderId}, ${payment.type}, ${payment.value}, ${payment.notes})`;
if (payment.type === "credit") {
await request.query`UPDATE [StoreCredits] SET value = value - ${payment.value} WHERE id = ${payment.notes}`;
}
}
await transaction.commit();
return true;
} catch(e) {
// transaction.rollback().catch(e => {}); // ignore the error // don't need to rollback, it rolls back on error automatically, abortTransactionOnError = true in options
throw e;
}
}
Я использую только один request
и выполняю все свои запросы на одном и том же, и, насколько я могу судить, он работает нормально.
Какая разница, если бы я делал новый transaction.request()
для каждого нового запроса? Есть ли обратная сторона? Будет ли сбой или можно делать разные запросы на одну и ту же транзакцию? Будет ли каждый отдельный запрос откат правильно, если один из них не удалось? (это то, что я хотел бы случиться)
[править]
Законченное тестирование, похоже, работает должным образом с точки зрения правильной вставки строк и правильного отката при сбое. Не знаю, есть ли еще недостаток, каковы плюсы и минусы для каждого.