узел mssql несколько запросов в одной ТРАНЗАКЦИИ НАЧАЛА

#node.js #sql-server #node-mssql

Вопрос:

Хотел бы сделать несколько обновлений через мой API с использованием mssql транзакций.

Пример:

  1. Таблица Доставки
  2. Таблица Перечисления
  3. Таблица сносок пользователей
  4. Таблица Customer_Login
  5. Таблица Push_Notification

Как правильно это сделать?

Сначала я думал о том, чтобы сделать это с помощью необработанных запросов.

 BEGIN TRANSACTION

CREATE IN SHIPPING

UPDATE IN LISTING

CREATE IN USER_NOTES

UPDATE IN CUSTOMER_LOGIN

CREATE IN PUSH_NOTIFICATION

COMMIT
 

Но я хочу избежать написания такого большого необработанного запроса, как этот.

Также я могу использовать транзакции mssql и запросы с (запросом.запрос).

 const transaction = new sql.Transaction(/* [pool] */)
transaction.begin(err => {
    // ... error checks

    const request = new sql.Request(transaction)
    request.query('create in shipping table', (err, result) => {
        // ... error checks

        transaction.commit(err => {
            // ... error checks

            console.log("Transaction committed.")
        })
    })

    request.query('Update in Listing Table', (err, result) => {
        // ... error checks

        transaction.commit(err => {
            // ... error checks

            console.log("Transaction committed.")
        })
    })

    and so on...
    .
    .
    .
})
 

Комментарии:

1. Большая партия на самом деле более эффективна, так как меньше поездок туда и обратно. Я бы использовал SET XACT_ABORT ON в верхней части пакета, чтобы убедиться, что транзакция не зависнет в случае исключения

2. Код не структурирован должным образом, потому что он вызывает transaction.commit внутри каждого запроса. Это следует вызывать только тогда, когда все запросы успешно завершены, поэтому вы либо помещаете запросы друг в друга и вызываете только transaction.commit самый внутренний, либо вы запускаете все запросы асинхронно и вызываете transaction.commit при Promise.all завершении или transaction.rollback отклонении.