package db import ( "context" "database/sql" ) // TransactionScopedWork describes code executed within a database transaction. type TransactionScopedWork func(ctx context.Context, db *sql.Tx) error // RunTransactionWithOptions executes a block of code within a database transaction. func RunTransactionWithOptions(ctx context.Context, db *sql.DB, txOpts *sql.TxOptions, txWork TransactionScopedWork) error { tx, err := db.BeginTx(ctx, txOpts) if err != nil { return err } if err = txWork(ctx, tx); err != nil { if txErr := tx.Rollback(); txErr != nil { return txErr } return err } return tx.Commit() }