mdb_txn_reset0(MDB_txn *txn)
 {
        MDB_env *env = txn->mt_env;
-       unsigned int i;
-
-       /* If there were uncommitted dbi_opens, undo them now */
-       for (i=env->me_numdbs; i<txn->mt_numdbs; i++)
-               mdb_dbi_close(env, i);
 
        if (F_ISSET(txn->mt_flags, MDB_TXN_RDONLY)) {
                if (!(env->me_flags & MDB_ROFS))
        } else {
                MDB_oldpages *mop;
                MDB_page *dp;
+               unsigned int i;
 
                /* close(free) all cursors */
                for (i=0; i<txn->mt_numdbs; i++) {
                mdb_default_cmp(txn, slot);
                if (!unused) {
                        txn->mt_numdbs++;
+                       txn->mt_env->me_numdbs++;
                }
        }
 
 void mdb_dbi_close(MDB_env *env, MDB_dbi dbi)
 {
        char *ptr;
-       if (dbi <= MAIN_DBI || dbi >= env->me_maxdbs)
+       if (dbi <= MAIN_DBI || dbi >= env->me_numdbs)
                return;
-       /* If the dbi is greater than env->me_numdbs, no harm is done.
-        * And it may happen if we're closing a DB that was just opened,
-        * but the opening txn hadn't committed yet.
-        */
        ptr = env->me_dbxs[dbi].md_name.mv_data;
        env->me_dbxs[dbi].md_name.mv_data = NULL;
        env->me_dbxs[dbi].md_name.mv_size = 0;