Thank you!

It appears that mdb_dbi_open() must be called before any read / write
access to a database in a transaction, and all read / write have to be done
in a transaction? If this is the case, is it correct that due to the
concurrency restriction above, there is essentially no concurrent access
(including read and write) to the same database in a multi-threaded
process, since a database is available to one transaction in a time?

2015-03-30 19:52 GMT+08:00 Hallvard Breien Furuseth <
[email protected]>:

> You're abusing mdb_dbi_open().  Its doc says:
>
>   "This function must not be called from multiple concurrent
>   transactions in the same process. A transaction that uses this
>   function must finish (either commit or abort) before any other
>   transaction in the process may use this function."
>
> That text could have stood out a bit better in the doc:-(
>
> The error is simple for lmdb to try to catch, though without
> locking it cannot guarantee to catch it.  Try this patch:
> <http://folk.uio.no/hbf/OpenLDAP/mdb.serial-open.diff>
>
> (Howard, this is branch "mdb/serial-open" in my UiO repo.)
> Not sure if it should do more than this.  E.g. attack mdb_drop
> too.  Maybe set MDB_TXN_ERROR since a program with broken
> threading can break the DB.
>
> --
> Hallvard
>

Reply via email to