Я настраиваю API для взаимодействия с моим приложением React и базой данных Microsoft SQL Server. У меня есть функция, которая должна удалять записи, и вставлять переменное количество записей после. Мне нужно, чтобы это было сделано в транзакции. Как мне сделать это с помощью пакета узла mssql
?
Я перепробовал много, если не все сообщения, которые мне удалось найти через Google.
Документация для mssql
пакету очень не хватает, поэтому, хотя у меня есть базовая структура, они не охватывают никаких конкретных примеров того, как сделать то, что я пытаюсь сделать (или что-нибудь в этом отношении).
Документация дляmssql
транзакций можно найти здесь
И я попробовал следующее:
async.each
Разрешение массива запросов
async и async.eachSeries
Используя некоторые из приведенных выше примеров. Я сталкиваюсь с ошибками, говоря, что он не может выполнить коммит, потому что есть запросы, которые все еще разрешаются, и это то, что я хочу, но они не должны получать коммит до того, как они разрешат ..
Мой текущий код выглядит так:
let statements = ['DELETE FROM ...', 'INSERT INTO ...', 'INSERT INTO ...', ...]
const transaction = new sql.Transaction(db);
transaction.begin(err => {
if(err)
{
res.sendStatus(500);
return console.error('Error in begin', err);
}
const request = new sql.Request(transaction);
async.eachSeries(statements, (statement, next) => {
request.query(statement, err => {
if(err) return next(err);
next();
});
}, err => {
if(err)
{
console.error('Error in queries, rolling back', err);
res.sendStatus(500);
return transaction.rollback();
}
transaction.commit(err => {
if(err) return console.error('Error in commit', err);
else
{
console.log('Done?');
res.sendStatus(200);
}
});
});
});
Основной процесс, который я пытаюсь выполнить:
- Удалить все записи, где два поля равны некоторым параметрам, которые я получаю из внешнего интерфейса
- Вставка новых записей с использованием объектов, которые я получаю из внешнего интерфейса
- Отправка состояния ответа внешнему интерфейсу в случае успеха или неудачи
В настоящее время выполняется оператор DELETE
, но ответ отправляет обратно 200 почти сразу, прежде чем разрешится любой из асинхронных вызовов. Я знаю это, потому что, если я принудительно закрываю внешний интерфейс, я получаю ошибки, в которых говорится о неразрешенных обещаниях и т. Д. Кроме того, на моем бэкенде я вижу, что данные были удалены, но не вставлены. 1046 *