#node.js #sql-server #node-mssql
Вопрос:
Хотел бы сделать несколько обновлений через мой API с использованием mssql
транзакций.
Пример:
- Таблица Доставки
- Таблица Перечисления
- Таблица сносок пользователей
- Таблица Customer_Login
- Таблица 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
отклонении.