Во-первых, существует очень мало баз данных, которые поддерживают действительно вложенные транзакции. Тем не менее, и MySQL, и Postgres поддерживают SAVEPOINT
, который можно использовать для выполнения того, что вы пытаетесь сделать. Если вы используете ORM как рельсы; он уже должен быть в состоянии обработать такой вариант использования.
Транзакции в HBase
Apache HBase не поддерживает транзакции в общепринятом смысле, т. Е. Не предоставляет возможности запустить и затем откатить операцию. Единственные транзакционные гарантии, которые предоставляет HBase:
- Атомарность операций на уровне строк.
- Любая операция сканирования, выполняемая в области HBase, будет видеть состояние данных в том виде, в котором оно было в начале сканирования. Он не увидит новые данные, которые были записаны в регион во время сканирования.
Мой совет - не ожидать таких же ожиданий от базы данных NoSQL, как от реляционной базы данных. HBase хорош для обработки десятков петабайт данных для выполнения точечных обновлений большого объема, считывания точек и сканирования диапазона. Однако управление кластером HBase является гораздо более сложной задачей, чем управление экземпляром MySQL. Вам нужно будет отказаться от многих требований, которые вы бы предъявляли к реляционной базе данных при переходе на HBase.
Тем не менее, существуют обходные пути к тому, что вы пытаетесь сделать, которые могут или не могут работать в зависимости от ваших точных настроек. Вы можете просто очистить всю БД / таблицу перед началом каждого теста.
Другим подходом для решения этой проблемы является использование другого движка поверх HBase, который обеспечивает SQL-подобную семантику. Apache Phoenix - один из таких проектов с очень активным сообществом разработчиков. В последней версии они развернули поддержку транзакций с несколькими строками (поддержка все еще находится на стадии бета-тестирования, и, конечно, здесь также нет вложенных транзакций).