package config import ( "context" "fmt" "gorm.io/gorm" ) func RunTx(ctx context.Context, db *gorm.DB, fn func(tx *gorm.DB) error) error { tx := db.WithContext(ctx).Begin() if tx.Error != nil { return fmt.Errorf("failed to begin transaction: %w", tx.Error) } defer func() { if p := recover(); p != nil { _ = tx.Rollback() panic(p) // Re-throw panic setelah rollback } }() if err := fn(tx); err != nil { if rbErr := tx.Rollback().Error; rbErr != nil { return fmt.Errorf("transaction error: %v, rollback error: %w", err, rbErr) } return err } if err := tx.Commit().Error; err != nil { return fmt.Errorf("failed to commit transaction: %w", err) } return nil }