ent_tx.go 865 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package entx
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/zeromicro/go-zero/core/logx"
  6. "wechat-api/ent"
  7. )
  8. // WithTx uses transaction in ent.
  9. func WithTx(ctx context.Context, client *ent.Client, fn func(tx *ent.Tx) error) error {
  10. tx, err := client.Tx(ctx)
  11. if err != nil {
  12. logx.Errorw("failed to start transaction", logx.Field("detail", err.Error()))
  13. return err
  14. }
  15. defer func() {
  16. if v := recover(); v != nil {
  17. tx.Rollback()
  18. panic(v)
  19. }
  20. }()
  21. if err := fn(tx); err != nil {
  22. if rollBackErr := tx.Rollback(); rollBackErr != nil {
  23. err = fmt.Errorf("%w: rolling back transaction: %v", err, rollBackErr)
  24. }
  25. logx.Errorw("errors occur in transaction", logx.Field("detail", err.Error()))
  26. return err
  27. }
  28. if err := tx.Commit(); err != nil {
  29. logx.Errorw("failed to commit transaction", logx.Field("detail", err.Error()))
  30. return err
  31. }
  32. return nil
  33. }