При выполнении транзакции, почему / почему бы не создать новый запрос? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть функция, которая принимает объект, некоторые свойства которого являются массивами, и выполняет серию 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() для каждого нового запроса? Есть ли обратная сторона? Будет ли сбой или можно делать разные запросы на одну и ту же транзакцию? Будет ли каждый отдельный запрос откат правильно, если один из них не удалось? (это то, что я хотел бы случиться)

[править] Законченное тестирование, похоже, работает должным образом с точки зрения правильной вставки строк и правильного отката при сбое. Не знаю, есть ли еще недостаток, каковы плюсы и минусы для каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...