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 <h.b.furuseth@usit.uio.no>:
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