code: func (db *DB) Update(fn func(*Tx) error) error {
  	t, err := db.Begin(true)
  	if err != nil {
  		return err
  	}
  
  	// Make sure the transaction rolls back in the event of a panic.
  	defer func() {
  		if t.db != nil {
  			t.rollback()
  		}
  	}()
  
  	// Mark as a managed tx so that the inner function cannot manually commit.
  	t.managed = true
  
  	// If an error is returned from the function then rollback and return error.
  	err = fn(t)
  	t.managed = false
  	if err != nil {
  		_ = t.Rollback()
  		return err
  	}
  
  	return t.Commit()
  }
docs: // Update executes a function within the context of a read-write managed transaction.
  // If no error is returned from the function then the transaction is committed.
  // If an error is returned then the entire transaction is rolled back.
  // Any error that is returned from the function or returned from the commit is
  // returned from the Update() method.
  //
  // Attempting to manually commit or rollback within the function will cause a panic.