Многие современные NoSQL-решения не поддерживают транзакции ACID (атомарные изолированные многоключевые обновления), но большинство из них поддерживают примитивы, которые позволяют реализовывать транзакции на уровне приложения.
Если хранилище данных поддерживает линеаризуемость по каждому ключу и сравнение-и-набор (атомарность на уровне документа), то достаточно реализовать транзакции на стороне клиента, более того, у вас есть несколько вариантов на выбор:
Если вам нужен Serializable уровень изоляции, то вы можете следовать тому же алгоритму, который Google использует для системы Percolator или Cockroach Labs для CockroachDB . Я написал в блоге об этом и создаю пошаговую визуализацию , надеюсь, это поможет вам понять основную идею алгоритма.
Если вы ожидаете высокого уровня конкуренции, но для вас вполне нормально иметь уровень изоляции Read Committed, пожалуйста, обратите внимание на транзакции RAMP от Peter Bailis.
Третий подход заключается в использовании компенсирующих транзакций, также известных как шаблон саги. Это было описано в конце 80-х годов в статье Sagas , но стало более актуальным с появлением распределенных систем. Пожалуйста, смотрите Применение шаблона саги Говорите для вдохновения.
Список хранилищ данных, подходящих для транзакций на стороне клиента, включает Cassandra с облегченными транзакциями, Riak с согласованными сегментами, RethinkDB, ZooKeeper, Etdc, HBase, DynamoDB, MongoDB и другие.