b_common.go 948 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package internal
  2. import (
  3. "context"
  4. iContext "gxt-file-server/app/context"
  5. "gxt-file-server/app/model"
  6. )
  7. // TransFunc 定义事务执行函数
  8. type TransFunc func(context.Context) error
  9. // ExecTrans 执行事务
  10. func ExecTrans(ctx context.Context, transModel model.ITrans, fn TransFunc) error {
  11. if _, ok := iContext.FromTrans(ctx); ok {
  12. return fn(ctx)
  13. }
  14. trans, err := transModel.Begin(ctx)
  15. if err != nil {
  16. return err
  17. }
  18. defer func() {
  19. if r := recover(); r != nil {
  20. _ = transModel.Rollback(ctx, trans)
  21. panic(r)
  22. }
  23. }()
  24. err = fn(iContext.NewTrans(ctx, trans))
  25. if err != nil {
  26. _ = transModel.Rollback(ctx, trans)
  27. return err
  28. }
  29. return transModel.Commit(ctx, trans)
  30. }
  31. // ExecTransWithLock 执行事务(加锁)
  32. func ExecTransWithLock(ctx context.Context, transModel model.ITrans, fn TransFunc) error {
  33. if !iContext.FromTransLock(ctx) {
  34. ctx = iContext.NewTransLock(ctx)
  35. }
  36. return ExecTrans(ctx, transModel, fn)
  37. }