code: func (db *DB) Do(fns ...txfunc) error {
  	l, err := lock.ExclusiveLock(db.dbdir, lock.Dir)
  	if err != nil {
  		return err
  	}
  	defer l.Close()
  
  	sqldb, err := sql.Open("ql", filepath.Join(db.dbdir, DbFilename))
  	if err != nil {
  		return err
  	}
  	defer sqldb.Close()
  
  	tx, err := sqldb.Begin()
  	if err != nil {
  		return err
  	}
  	for _, fn := range fns {
  		if err := fn(tx); err != nil {
  			tx.Rollback()
  			return err
  		}
  	}
  	return tx.Commit()
  }
docs: // Do Opens the db, executes DoTx and then Closes the DB
  // To support a multiprocess and multigoroutine model on a single file access
  // database like ql there's the need to exlusively lock, open, close, unlock the
  // db for every transaction. For this reason every db transaction should be
  // fast to not block other processes/goroutines.