Столкнулись тут с однйо проблемой: судя по комментарию в исходниках lmdb есть ограничение на вложенную транзакцию:
int
mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
{
MDB_txn *txn;
MDB_ntxn *ntxn;
int rc, size, tsize;
flags &= MDB_TXN_BEGIN_FLAGS;
flags |= env->me_flags & MDB_WRITEMAP;
if (env->me_flags & MDB_RDONLY & ~flags) /* write txn in RDONLY env */
return EACCES;
if (parent) {
/* Nested transactions: Max 1 child, write txns only, no writemap */
flags |= parent->mt_flags;
if (flags & (MDB_RDONLY|MDB_WRITEMAP|MDB_TXN_BLOCKED)) {
return (parent->mt_flags & MDB_TXN_RDONLY) ? EINVAL : MDB_BAD_TXN;
}
В документации не нашел внятного объяснения про эти ошграничения, может кто-то сталкивался и знает как с этим жить?
Z>В документации не нашел внятного объяснения про эти ошграничения, может кто-то сталкивался и знает как с этим жить?
Я сильно в сорцах не копал, но вроде можно много вложенных транзакций (если только не режим MDB_WRITEMAP), но одновременно у одного parent 2 открыте child транзакции нельзя.
В доках пишут почти тоже самое:
Transactions may be nested to any level. A parent transaction and its cursors may not issue any other operations than mdb_txn_commit and mdb_txn_abort while it has active child transactions.
Здравствуйте, hi_octane, Вы писали:
Z>>В документации не нашел внятного объяснения про эти ошграничения, может кто-то сталкивался и знает как с этим жить?
_>Я сильно в сорцах не копал, но вроде можно много вложенных транзакций (если только не режим MDB_WRITEMAP), но одновременно у одного parent 2 открыте child транзакции нельзя.
_>В доках пишут почти тоже самое:
_>_>Transactions may be nested to any level. A parent transaction and its cursors may not issue any other operations than mdb_txn_commit and mdb_txn_abort while it has active child transactions.
2 child это понятно что нельзя.
Но там контекст такой: если родительская транзакция MDB_TXN_RDONLY и дочерняя MDB_TXN_RDONLY, то так нельзя.
Как это понимать то?