Кажется, что ссылки, которые вы включили, в основном отвечают на ваши вопросы.
Как уже говорилось, при создании вложенной транзакции вам необходимо передать дескриптор родительской транзакции в mdb_txn_begin
. Ограничение «одна транзакция записи за один раз» не применяется к дочерним транзакциям родительской транзакции.
Вы можете зафиксировать или отменить эффекты дочерней транзакции без фиксации или отмены родительской транзакции. Если вы фиксируете изменения, они становятся частью изменений родительской транзакции (пока не видимы для внешнего мира). Затем родительская транзакция должна зафиксировать изменения для сохранения.
Как описано в вашей ссылке на BDB, это может быть полезно, если вы хотите выполнить несколько независимых единиц работы в одной транзакции (возможно, из соображений производительности). Вы можете открыть родительскую транзакцию, а затем выполнить каждую единицу работы в своей собственной дочерней транзакции. Если в единице работы есть сбой, вы можете откатить ее, не затрагивая другие единицы работы, а затем приступить к обработке оставшейся части. Когда вы окончательно фиксируете родительский объект, к БД будут применены только успешные блоки.