Skip to content

Instantly share code, notes, and snippets.

@silenceper
Created November 5, 2020 03:06
Show Gist options
  • Save silenceper/e6fada169fd9e6b46512a701604eca84 to your computer and use it in GitHub Desktop.
Save silenceper/e6fada169fd9e6b46512a701604eca84 to your computer and use it in GitHub Desktop.
ent-transactions-best-practices
// WithTx 通过WithTx进行事物操作,helper 方法
func WithTx(ctx context.Context, client *ent.Client, fn func(tx *ent.Tx) error) error {
tx, err := client.Tx(ctx)
if err != nil {
return err
}
defer func() {
if v := recover(); v != nil {
tx.Rollback()
panic(v)
}
}()
if err := fn(tx); err != nil {
if rerr := tx.Rollback(); rerr != nil {
err = errors.Wrapf(err, "rolling back transaction: %v", rerr)
}
return err
}
if err := tx.Commit(); err != nil {
return errors.Wrapf(err, "committing transaction: %v", err)
}
return nil
}
// Do 借助WithTx,在Gen方法中执行具体的sql操作
func Do(ctx context.Context, client *ent.Client) {
// WithTx helper.
if err := WithTx(ctx, client, func(tx *ent.Tx) error {
return Gen(ctx, tx.Client())
}); err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment