db.go 524 B

1234567891011121314151617181920212223242526272829303132333435
  1. package utils
  2. import (
  3. "fmt"
  4. "log"
  5. "runtime/debug"
  6. "gorm.io/gorm"
  7. )
  8. func Transact(db *gorm.DB, f func(tx *gorm.DB) error) (err error) {
  9. tx := db.Begin()
  10. defer func() {
  11. if r := recover(); r != nil {
  12. if er, ok := r.(error); ok {
  13. err = er
  14. } else {
  15. err = fmt.Errorf("%+v", r)
  16. }
  17. log.Println(err)
  18. debug.PrintStack()
  19. }
  20. if err != nil {
  21. if e := tx.Rollback().Error; e != nil {
  22. log.Println("Rollback Error:", e)
  23. }
  24. } else {
  25. err = tx.Commit().Error
  26. }
  27. }()
  28. err = f(tx)
  29. return
  30. }