// must be called under an environment and parent lock
 DbRetVal TxnBegin(DB_TXN* parxp, Txn txn, Txn.BeginFlags flags) {
   DbRetVal ret;
   RuntimeHelpers.PrepareConstrainedRegions();
   try { }
   finally {
     DB_TXN* txp;
     DB_ENV* evp = CheckDisposed();
     ret = evp->TxnBegin(evp, parxp, out txp, unchecked((UInt32)flags));
     if (ret == DbRetVal.SUCCESS) {
       txn.Initialize(txp);
       transactions.Insert(txn);
     }
   }
   return ret;
 }
 public Txn CdsGroupBegin() {
   Txn txn = new Txn(this);
   DbRetVal ret;
   lock (rscLock) {
     RuntimeHelpers.PrepareConstrainedRegions();
     try { }
     finally {
       DB_TXN* txp;
       DB_ENV* evp = CheckDisposed();
       ret = evp->CdsGroupBegin(evp, out txp);
       if (ret == DbRetVal.SUCCESS) {
         txn.Initialize(txp);
         transactions.Insert(txn);
       }
     }
   }
   Util.CheckRetVal(ret);
   return txn;
 }