В LMDB, как вложить одну транзакцию RW в другую транзакцию RW? Какова практическая польза / применение вложенных транзакций в LMDB? - PullRequest
0 голосов
/ 16 января 2020

На странице: http://www.lmdb.tech/doc/starting.html

§1

Транзакции могут быть только для чтения или записи, а транзакции для чтения и записи могут быть вложенный.

§2

Может быть несколько одновременно активных транзакций только для чтения, но только одна, которая может писать. Как только одна транзакция чтения-записи открыта, все дальнейшие попытки начать одну блокируются, пока первая не будет зафиксирована или прервана. Однако это не влияет на транзакции, доступные только для чтения, и они могут продолжать открываться в любое время.

Итак, как транзакция RW может стать родительской для другой транзакции RW если только один RW txn может существовать в среде lmdb одновременно?


Ссылки:

  1. Конструктор дескриптора txn, mdb_txn_begin (...) , принимает необязательный дескриптор txn, чтобы сделать его родителем будущей транзакции. Таким образом, экземпляр MDB_txn , скажем parent-txn-handle, необходим заранее, чтобы предоставить mdb_txn_begin, чтобы parent-txn-handle стал родителем would-be-child-txn-handle.

1 Ответ

0 голосов
/ 16 января 2020

Кажется, что ссылки, которые вы включили, в основном отвечают на ваши вопросы.

Как уже говорилось, при создании вложенной транзакции вам необходимо передать дескриптор родительской транзакции в mdb_txn_begin. Ограничение «одна транзакция записи за один раз» не применяется к дочерним транзакциям родительской транзакции.

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

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

...