Spaces:
Configuration error
Configuration error
| 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 | |
| } | |