Я хочу использовать разные базы данных Berkeley-DB для хранения разных классов объектов в моем приложении. Транзакции в одной БД могут быть сделаны атомарно, используя DbTxn :: commit. Однако, если я использую несколько баз данных, мне нужно создать несколько транзакций (по одной для каждой базы данных), верно? В этом случае, если фиксация первой успешна, но вторая не удалась, есть ли способ откатить уже совершенную первую транзакцию? (Насколько я понимаю, DbTxn :: abort больше нельзя использовать после фиксации транзакции.)
Есть ли какой-нибудь способ добиться атомарных транзакций в нескольких базах данных?
Если вы используете несколько баз данных, вам не нужно создавать несколько транзакций. Используя одну транзакцию, вы можете работать с несколькими БД.
Посмотри пожалуйста эта ссылка для документации Db :: Open ().
Имеет параметр «DbTxn * txnid». Вы можете указать идентификатор транзакции, возвращаемый API DB_ENV-> txn_begin (). Поэтому перед открытием БД необходимо получить идентификатор транзакции.
Внимательно прочитайте примечание под параметромtxnid‘в данной документации ссылка.
Обратите внимание, что вы не должны указывать DB_AUTO_COMMIT флаг в API Db :: open (). Вместо этого вы будете указывать один и тот же идентификатор транзакции для параметра ‘txnid’ для всех БД, с которыми вы хотите работать. Таким образом, вы можете достичь атомарных транзакций в нескольких базах данных.
В общем, вам нужно что-то вроде распределенного менеджера транзакций, полный ответ заполняет книги. См. «Книгу Беркли БД», ГЛАВА 9, «Распределенные транзакции и стратегии распределения данных», ISBN-10: 1-59059-672-2.