code: func (c *Connection) Transaction(fn func(tx *Connection) error) error {
  	return c.Dialect.Lock(func() error {
  		var dberr error
  		cn, err := c.NewTransaction()
  		if err != nil {
  			return err
  		}
  		err = fn(cn)
  		if err != nil {
  			dberr = cn.TX.Rollback()
  		} else {
  			dberr = cn.TX.Commit()
  		}
  		if err != nil {
  			return errors.WithStack(err)
  		}
  		return errors.Wrap(dberr, "error committing or rolling back transaction")
  	})
  
  }
docs: // Transaction will start a new transaction on the connection. If the inner function
  // returns an error then the transaction will be rolled back, otherwise the transaction
  // will automatically commit at the end.