Требуется ли откат транзакций хранилища данных при сохранении или удалении?
В примере для dataset.runInTransaction
( ссылка), есть явная обработка ошибок, которая происходит на transaction.get(key,callback)
,
Но на других операциях, таких как transaction.save(entity)
или же transaction.delete(key)
нет никаких обратных вызовов, поэтому на самом деле нет способа обрабатывать ошибки. Например:
dataset.runInTransaction(function(transaction, done) {
transaction.save({
key: dataset.key(['Company', 123]),
data: {}
});
transaction.delete(dataset.key(['Company', 456]));
done();
}, function(err, apiResponse) {});
Означает ли это, что нет необходимости явно откатывать транзакцию?
2 ответа
Я также пытался найти ту же проблему, но нашел следующий вопрос полезным.
Я провел много взад-вперед с gcloud-node
Участники трекера:
- https://github.com/GoogleCloudPlatform/gcloud-node/issues/1120
- https://github.com/GoogleCloudPlatform/gcloud-node/issues/633
в основном все изменения выполняются одновременно (один раз done()
называется), поэтому, если произойдет сбой, вся транзакция будет прервана в это время.
что сбивало с толку то, что некоторые операции, такие как transaction.get()
есть обратные вызовы. В основном версия объекта, возвращаемая transaction.get()
должен соответствовать версии до .save()
или же .delete()
происходит (что опять же происходит, когда done()
вызывается) если версия не совпадает, транзакция автоматически прерывается.
с помощью transaction.rollback()
все еще полезно, если что-то в вашем .get()
вызов не соответствует тому, что ожидает ваш код.