Files
pig-farm-controller/internal/infra/repository/unit_of_work.go

59 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package repository
import (
"fmt"
"gorm.io/gorm"
)
// UnitOfWork 定义了工作单元接口,用于抽象事务管理
type UnitOfWork interface {
// ExecuteInTransaction 在一个数据库事务中执行给定的函数。
// 如果函数返回错误,事务将被回滚;否则,事务将被提交。
// tx 参数是当前事务的 GORM DB 实例,应传递给所有仓库方法。
ExecuteInTransaction(fn func(tx *gorm.DB) error) error
}
// gormUnitOfWork 是 UnitOfWork 接口的 GORM 实现
type gormUnitOfWork struct {
db *gorm.DB
}
// NewGormUnitOfWork 创建一个新的 gormUnitOfWork 实例
func NewGormUnitOfWork(db *gorm.DB) UnitOfWork {
return &gormUnitOfWork{db: db}
}
// ExecuteInTransaction 实现了 UnitOfWork 接口的事务执行逻辑
func (u *gormUnitOfWork) ExecuteInTransaction(fn func(tx *gorm.DB) error) error {
tx := u.db.Begin()
if tx.Error != nil {
return fmt.Errorf("开启事务失败: %w", tx.Error)
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
// 可以选择在此处记录 panic 日志
// u.logger.Errorf("事务中发生 panic已回滚: %v", r)
} else if tx.Error != nil { // 如果函数执行过程中返回错误,或者事务本身有错误,则回滚
tx.Rollback()
// 可以选择在此处记录错误日志
// u.logger.Errorf("事务执行失败,已回滚: %v", tx.Error)
}
}()
// 执行业务逻辑函数
if err := fn(tx); err != nil {
tx.Rollback()
return err // 返回业务逻辑函数中的错误
}
// 提交事务
if err := tx.Commit().Error; err != nil {
return fmt.Errorf("提交事务失败: %w", err)
}
return nil
}