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 >
