- /* begin transaction */
- rc = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, bdb->bi_db_opflags );
- if ( rc != 0 ) {
-#ifdef NEW_LOGGING
- LDAP_LOG (( "operational", LDAP_LEVEL_ERR,
- "=> bdb_operational: txn_begin failed: %s (%d)\n",
- db_strerror(rc), rc ));
-#else
- Debug( LDAP_DEBUG_TRACE,
- "bdb_operational: txn_begin failed: %s (%d)\n",
- db_strerror( rc ), rc, 0 );
-#endif
- rc = LDAP_OTHER;
- return rc;
+ /* Check for a txn in a parent op, otherwise use reader txn */
+ LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+ if ( oex->oe_key == bdb )
+ break;
+ }
+ opinfo = (struct bdb_op_info *) oex;
+ if ( opinfo && opinfo->boi_txn ) {
+ rtxn = opinfo->boi_txn;
+ } else {
+ rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn);
+ if ( rc ) {
+ rc = LDAP_OTHER;
+ goto done;
+ }