goto return_results;
        }
 
+       /* begin transaction */
+       rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi );
+       rs->sr_text = NULL;
+       if( rs->sr_err != 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       LDAP_XSTRING(mdb_add) ": txn_begin failed: %s (%d)\n",
+                       mdb_strerror(rs->sr_err), rs->sr_err, 0 );
+               rs->sr_err = LDAP_OTHER;
+               rs->sr_text = "internal error";
+               goto return_results;
+       }
+       txn = moi->moi_txn;
+
        /* add opattrs to shadow as well, only missing attrs will actually
         * be added; helps compatibility with older OL versions */
        rs->sr_err = slap_add_opattrs( op, &rs->sr_text, textbuf, textlen, 1 );
 
        subentry = is_entry_subentry( op->ora_e );
 
-       /* begin transaction */
-       rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi );
-       rs->sr_text = NULL;
-       if( rs->sr_err != 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       LDAP_XSTRING(mdb_add) ": txn_begin failed: %s (%d)\n",
-                       mdb_strerror(rs->sr_err), rs->sr_err, 0 );
-               rs->sr_err = LDAP_OTHER;
-               rs->sr_text = "internal error";
-               goto return_results;
-       }
-
-       txn = moi->moi_txn;
-
        /*
         * Get the parent dn and see if the corresponding entry exists.
         */
 
 
        ctrls[num_ctrls] = 0;
 
-       /* allocate CSN */
-       if ( BER_BVISNULL( &op->o_csn ) ) {
-               struct berval csn;
-               char csnbuf[LDAP_PVT_CSNSTR_BUFSIZE];
-
-               csn.bv_val = csnbuf;
-               csn.bv_len = sizeof(csnbuf);
-               slap_get_csn( op, &csn, 1 );
-       }
-
        /* begin transaction */
        rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi );
        rs->sr_text = NULL;
                rs->sr_text = "internal error";
                goto return_results;
        }
-
        txn = moi->moi_txn;
 
+       /* allocate CSN */
+       if ( BER_BVISNULL( &op->o_csn ) ) {
+               struct berval csn;
+               char csnbuf[LDAP_PVT_CSNSTR_BUFSIZE];
+
+               csn.bv_val = csnbuf;
+               csn.bv_len = sizeof(csnbuf);
+               slap_get_csn( op, &csn, 1 );
+       }
+
        if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) {
                dnParent( &op->o_req_ndn, &pdn );
        }
 
 
        ctrls[num_ctrls] = NULL;
 
-       /* Don't touch the opattrs, if this is a contextCSN update
-        * initiated from updatedn */
-       if ( !be_isupdate(op) || !op->orm_modlist || op->orm_modlist->sml_next ||
-                op->orm_modlist->sml_desc != slap_schema.si_ad_contextCSN ) {
-
-               slap_mods_opattrs( op, &op->orm_modlist, 1 );
-       }
-
        /* begin transaction */
        rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi );
        rs->sr_text = NULL;
                rs->sr_text = "internal error";
                goto return_results;
        }
-
        txn = moi->moi_txn;
 
+       /* Don't touch the opattrs, if this is a contextCSN update
+        * initiated from updatedn */
+       if ( !be_isupdate(op) || !op->orm_modlist || op->orm_modlist->sml_next ||
+                op->orm_modlist->sml_desc != slap_schema.si_ad_contextCSN ) {
+
+               slap_mods_opattrs( op, &op->orm_modlist, 1 );
+       }
+
        /* get entry or ancestor */
        rs->sr_err = mdb_dn2entry( op, txn, NULL, &op->o_req_ndn, &e, 1 );
 
 
 
        ctrls[num_ctrls] = NULL;
 
-       slap_mods_opattrs( op, &op->orr_modlist, 1 );
-
        /* begin transaction */
        rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi );
        rs->sr_text = NULL;
                rs->sr_text = "internal error";
                goto return_results;
        }
-
        txn = moi->moi_txn;
 
+       slap_mods_opattrs( op, &op->orr_modlist, 1 );
+
        if ( be_issuffix( op->o_bd, &op->o_req_ndn ) ) {
 #ifdef MDB_MULTIPLE_SUFFIXES
                /* Allow renaming one suffix entry to another */