anchor.diff:          let fs = io.OpenForReading()
           let hook (csr:ICursor) =
               fs.Close()
  -            // TODO remove csr from cursors list
  +            // TODO remove csr from cursors list.  which means we need
  +            // a way to get the guid for a cursor.
           let csr = BTreeSegment.OpenCursor(fs, pageSize, rootPage, new Action<ICursor>(hook))
           lock critSectionCursors (fun () -> cursors <- (g,csr) :: cursors; )
           csr
  
positive.code: 
      interface ITransaction with
          member this.Commit(newGuids:seq<Guid>) =
              let newGuidsAsMap = Seq.fold (fun acc g -> Map.add g () acc) Map.empty newGuids
              let mySegmentsInWaiting = Map.filter (fun g _ -> Map.containsKey g newGuidsAsMap) segmentsInWaiting
              lock critSectionHeader (fun () -> 
                  let newState = (List.ofSeq newGuids) @ header.currentState
                  let newSegments = Map.fold (fun acc key value -> Map.add key value acc) header.segments mySegmentsInWaiting
                  let newSill = saveSegmentInfoList newSegments
                  let newHeader = {header with sill = newSill; currentState=newState;}
                  writeHeader newHeader
                  // TODO the old location of the segment info list is now free pages
                  header <- newHeader
              )
              // no need for lock critSectionInTransaction here because there is
  
negative.code:             // no way for the code to be here unless the caller is holding the
              // lock.
              inTransaction <- false
              // TODO we could have Rollback accept a seq<Guid> so we could release
              // any segments in waiting that got written before the owner of the tx
              // decided to rollback.
  
  
      interface IDatabase with
  