Berkeley-DB: атомарные транзакции в нескольких базах данных

Я хочу использовать разные базы данных Berkeley-DB для хранения разных классов объектов в моем приложении. Транзакции в одной БД могут быть сделаны атомарно, используя DbTxn :: commit. Однако, если я использую несколько баз данных, мне нужно создать несколько транзакций (по одной для каждой базы данных), верно? В этом случае, если фиксация первой успешна, но вторая не удалась, есть ли способ откатить уже совершенную первую транзакцию? (Насколько я понимаю, DbTxn :: abort больше нельзя использовать после фиксации транзакции.)

Есть ли какой-нибудь способ добиться атомарных транзакций в нескольких базах данных?

1

Решение

Если вы используете несколько баз данных, вам не нужно создавать несколько транзакций. Используя одну транзакцию, вы можете работать с несколькими БД.

Посмотри пожалуйста эта ссылка для документации Db :: Open ().

Имеет параметр «DbTxn * txnid». Вы можете указать идентификатор транзакции, возвращаемый API DB_ENV-> txn_begin (). Поэтому перед открытием БД необходимо получить идентификатор транзакции.

Внимательно прочитайте примечание под параметромtxnid‘в данной документации ссылка.

Обратите внимание, что вы не должны указывать DB_AUTO_COMMIT флаг в API Db :: open (). Вместо этого вы будете указывать один и тот же идентификатор транзакции для параметра ‘txnid’ для всех БД, с которыми вы хотите работать. Таким образом, вы можете достичь атомарных транзакций в нескольких базах данных.

3

Другие решения

В общем, вам нужно что-то вроде распределенного менеджера транзакций, полный ответ заполняет книги. См. «Книгу Беркли БД», ГЛАВА 9, «Распределенные транзакции и стратегии распределения данных», ISBN-10: 1-59059-672-2.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector