NodeJS: обработка транзакций с базами данных NoSQL? - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим кусочек кода с обещаниями, например:

return Promise.resolve()
  .then(function () {
    return createSomeData(...);
  })
  .then(function () {
    return updateSomeData(...);
  })
  .then(function () {
    return deleteSomeData(...);
  })
  .catch(function (error) {
    return ohFishPerformRollbacks();
  })
  .then(function () {
    return Promise.reject('something failed somewhere');
  })

В приведенном выше коде, скажем, что-то пошло не так в функции updateSomeData(...). Затем нужно будет отменить операцию создания, которая была выполнена до этого.

В другом случае, если что-то пошло не так в функции deleteSomeData(...), то нужно будет вернуть операции, выполненные в createSomeData(...) и updateSomeData(...). Это будет продолжаться до тех пор, пока все блоки имеют определенные операции возврата, определенные для себя, на случай, если что-то пойдет не так.

Только если бы в NodeJ, в базе данных или где-то посередине был какой-то путь, это могло бы вернуть все транзакции, происходящие под одним и тем же блоком кода.

Один из способов, которым я могу думать об этом, - пометить все строки в базе данных transactionId (ObjectID) и wasTransactionSuccessful(boolean), чтобы операции CRUD можно было объединить вместе с их transactionId s, и если что-то пойдет не так, эти транзакции могут быть просто удалены из базы данных в конечном блоке catch.

Я читал об откате транзакций в https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/. Но я хочу посмотреть, можно ли сделать это более простым способом и универсальным образом для адаптации баз данных NoSQL.

1 Ответ

0 голосов
/ 09 мая 2018

Я не уверен, что это удовлетворит ваш вариант использования, но я надеюсь, что это будет.

    let indexArray = [1, 2, 3];
    let promiseArray = [];
    let sampleFunction = (index) => {
        return new Promise((resolve, reject) => {
            setTimeout(resolve, 100, index);
        });
    }
    indexArray.map((element) => {
        promiseArray.push(sampleFunction(element));
    });
    Promise.all(promiseArray).then((data) => {
        // do whatever you want with the results
    }).catch((err) => {
        //Perform your entire rollback here
    });

async.waterfall([
    firstFunc,
    secondFunc
], function (err, result) {
    if (err) {
        // delete the entire thing
    }
});

Использование асинхронной библиотеки даст вам гораздо более элегантное решение, чем использование цепочек.

...