41 lines
967 B
Go
41 lines
967 B
Go
package repositories
|
|
|
|
import (
|
|
"log"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// TransactionManager struct untuk handle manual transaction
|
|
type TransactionManager struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewTransactionManager(db *gorm.DB) *TransactionManager {
|
|
return &TransactionManager{db: db}
|
|
}
|
|
|
|
// Begin memulai transaksi database
|
|
func (m *TransactionManager) Begin() *gorm.DB {
|
|
return m.db.Begin()
|
|
}
|
|
|
|
// Rollback membatalkan transaksi jika terjadi error
|
|
func (m *TransactionManager) Rollback(tx *gorm.DB) {
|
|
// Rollback hanya jika transaksi belum di-commit/rollback
|
|
if r := recover(); r != nil {
|
|
tx.Rollback()
|
|
log.Printf("⚠️ Transaction panicked: %v", r)
|
|
} else if tx.Error != nil {
|
|
// Jika tx sudah error, rollback
|
|
tx.Rollback()
|
|
} else {
|
|
// Rollback aman
|
|
tx.Rollback()
|
|
}
|
|
}
|
|
|
|
// Commit menyimpan perubahan permanen ke database
|
|
func (m *TransactionManager) Commit(tx *gorm.DB) error {
|
|
return tx.Commit().Error
|
|
} |