code: func (s *Store) TxDelete(tx *bolt.Tx, key, dataType interface{}) error {
  	if !tx.Writable() {
  		return bolt.ErrTxNotWritable
  	}
  
  	storer := newStorer(dataType)
  	gk, err := encode(key)
  
  	if err != nil {
  		return err
  	}
  
  	b := tx.Bucket([]byte(storer.Type()))
  	if b == nil {
  		return ErrNotFound
  	}
  
  	value := reflect.New(reflect.TypeOf(dataType)).Interface()
  
  	bVal := b.Get(gk)
  
  	err = decode(bVal, value)
  	if err != nil {
  		return err
  	}
  
  	// delete data
  	err = b.Delete(gk)
  
  	if err != nil {
  		return err
  	}
  
  	// remove any indexes
  	return indexDelete(storer, tx, gk, value)
  }
docs: // TxDelete is the same as Delete except it allows you specify your own transaction