35 lines
645 B
Go
35 lines
645 B
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"likedream-goframe/internal/ent"
|
|
"likedream-goframe/internal/utils"
|
|
|
|
"entgo.io/ent/dialect/sql"
|
|
"github.com/samber/oops"
|
|
)
|
|
|
|
func WithTx(ctx context.Context, f func(ctx context.Context, tx *ent.Tx), opts *sql.TxOptions) error {
|
|
tx, err := Global.BeginTx(ctx, opts)
|
|
|
|
if err != nil {
|
|
return oops.WithContext(ctx).Wrap(err)
|
|
}
|
|
|
|
err = utils.Catch(func() {
|
|
f(ctx, tx)
|
|
})
|
|
|
|
if err != nil {
|
|
if rbErr := tx.Rollback(); rbErr != nil {
|
|
return oops.
|
|
With("rollback", false).
|
|
WithContext(ctx).
|
|
Join(rbErr, err)
|
|
}
|
|
return oops.WithContext(ctx).With("rollback", true).Wrap(err)
|
|
}
|
|
|
|
return nil
|
|
}
|