Cara Handle Database Transactions Di Go
1. Masalah Utama
Scenario yang Ingin Dicapai:
// service/order_service.go
type OrderService struct {
userRepo repository.UserRepository
productRepo repository.ProductRepository
orderRepo repository.OrderRepository
}
func (s *OrderService) CreateOrder(userID, productID int) error {
// 1. Check user exists
user, err := s.userRepo.FindByID(userID)
if err != nil {
return err
}
// 2. Check product exists and has stock
product, err := s.productRepo.FindByID(productID)
if err != nil {
return err
}
if product.Stock <= 0 {
return errors.New("product out of stock")
}
// 3. Create order
order := &Order{
UserID: userID,
ProductID: productID,
Status: "pending",
}
err = s.orderRepo.Create(order)
if err != nil {
return err
}
// 4. Update product stock
product.Stock--
err = s.productRepo.Update(product)
if err != nil {
return err
}
// 5. Update user's order count
user.OrderCount++
err = s.userRepo.Update(user)
if err != nil {
return err
}
return nil
}Masalah:
2. Solusi 1: Unit of Work Pattern
Konsep:
Implementasi:
3. Solusi 2: Transaction Manager Pattern
Konsep:
Implementasi:
4. Solusi 3: Domain Events Pattern
Konsep:
Implementasi:
5. Solusi 4: Command Pattern with Transaction Decorator
Konsep:
Implementasi:
6. Perbandingan Solusi
Solusi
Keuntungan
Kerugian
Use Case
7. Rekomendasi: Hybrid Approach
Best Practice untuk Kebanyakan Aplikasi:
8. Best Practices Summary
✅ Do:
❌ Don't:
🎯 Pattern Selection Guide:
Scenario
Recommended Pattern
9. Final Implementation Example
Complete Transaction Handling:
PreviousBest Practice Github Action Untuk Manjemen ReleaseNextmTLS (Mutual Transport Layer Security)
Last updated