package database import ( "context" "github.com/jackc/pgx/v4" "github.com/jackc/pgx/v4/pgxpool" "github.com/pkg/errors" ) func WithTx(ctx context.Context, pool *pgxpool.Pool, fn func(context.Context, pgx.Tx) error) error { tx, err := pool.BeginTx(ctx, pgx.TxOptions{}) if err != nil { return errors.Wrap(err, "could not begin transaction") } defer func() { if err := tx.Rollback(ctx); err != nil && !errors.Is(err, pgx.ErrTxClosed) { panic(errors.Wrap(err, "could not rollback transaction")) } }() if err := fn(ctx, tx); err != nil { err := errors.Wrap(err, "could not apply down migration") if rollbackErr := tx.Rollback(ctx); rollbackErr != nil { return errors.Wrap(err, rollbackErr.Error()) } return err } if err := tx.Commit(ctx); err != nil { return errors.Wrap(err, "could not commit transaction") } return nil }