lifedebugger's picture
Deploy files from GitHub repository
48471f7
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
}