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