Рассмотрим кусочек кода с обещаниями, например:
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.