27 lines
748 B
Go
27 lines
748 B
Go
package db
|
|
|
|
import "context"
|
|
|
|
// txFunc represents a function that does work in the context of a transaction.
|
|
type txFunc func(tx Executor) (interface{}, error)
|
|
|
|
// WithTransaction runs the given function in a transaction, rolling back if it
|
|
// returns an error and committing if not. The provided context is also attached
|
|
// to the transaction. WithTransaction also passes through a value returned by
|
|
// `f`, if there is no error.
|
|
func WithTransaction(ctx context.Context, dbMap DatabaseMap, f txFunc) (interface{}, error) {
|
|
tx, err := dbMap.BeginTx(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result, err := f(tx)
|
|
if err != nil {
|
|
return nil, rollback(tx, err)
|
|
}
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|