Настолько захватывающе, что MongoDB 4.0 поддерживает многодокументные ACID-транзакции !! Но мне интересно, решит ли новая функция мою проблему?
Предыстория: у меня есть несколько микросервисов, они используют один и тот же mongdb, поэтому нам приходится сталкиваться с проблемой транзакций между ними.
Пример: A запускает транзакцию, затем вызывает службу B и службу C через http, а B вызывает D. Если один из B, C, D не работает, нам нужно выполнить откат. в этой распределенной системе трудно достичь этой цели, поэтому мне интересно, будет ли у mongodb 4.0 простой способ решить эту проблему.
A
/ \
B C
\
D
Я прочитал спецификации отсюда: https://github.com/mongodb/specifications/blob/master/source/transactions/transactions.rst, я обнаружил, что mongo использует lsid, txnNumber для идентификации транзакции. Итак, это означает, что я разработаю специальный Mongo-Driver, который принимает lsid, txnNumber в качестве параметров для создания специальной команды, и это достигнет моей цели: если один шаг вызовет ошибку, откатить все!

if one of B,C,D failed, we need to rollback
Есть альтернативные способы сделать это без многодокументных транзакций. У вас может быть документ, который обновляется процессами A, B, C и D. Например, D отмечает документ как completed.
Многодокументные транзакции MongoDB разработан для ситуаций, когда требуется атомарность для обновлений нескольких документов или согласованность между чтениями нескольких документов. Итак, несколько операций с базой данных и / или несколько документов как одна транзакция. Судя по вашему описанию, ваш вариант использования больше касается нескольких этапов, которые могут проходить или нет, это можно решить с помощью соответствующего моделирование данных.
Кроме того, обратите внимание, что существует также ограничение на время существования транзакции. По умолчанию 60 секунд. См. Также transactionLifetimeLimitSeconds.