code: func (s *Store) TxUpdate(tx *bolt.Tx, key interface{}, data interface{}) error {
  	if !tx.Writable() {
  		return bolt.ErrTxNotWritable
  	}
  
  	storer := newStorer(data)
  
  	gk, err := encode(key)
  
  	if err != nil {
  		return err
  	}
  
  	b, err := tx.CreateBucketIfNotExists([]byte(storer.Type()))
  	if err != nil {
  		return err
  	}
  
  	existing := b.Get(gk)
  
  	if existing == nil {
  		return ErrNotFound
  	}
  
  	// delete any existing indexes
  	existingVal := reflect.New(reflect.TypeOf(data)).Interface()
  
  	err = decode(existing, existingVal)
  	if err != nil {
  		return err
  	}
  
  	err = indexDelete(storer, tx, gk, existingVal)
  	if err != nil {
  		return err
  	}
  
  	value, err := encode(data)
  	if err != nil {
  		return err
  	}
  
  	// put data
  	err = b.Put(gk, value)
  	if err != nil {
  		return err
  	}
  
  	// insert any new indexes
  	return indexAdd(storer, tx, gk, data)
  }
docs: // TxUpdate is the same as Update except it allows you to specify your own transaction