修改infra.repository包

This commit is contained in:
2025-11-05 23:00:07 +08:00
parent 97aea66f7c
commit 10b123ab93
25 changed files with 877 additions and 608 deletions

View File

@@ -1,9 +1,11 @@
package repository
import (
"context"
"fmt"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
"gorm.io/gorm"
)
@@ -12,35 +14,40 @@ type UnitOfWork interface {
// ExecuteInTransaction 在一个数据库事务中执行给定的函数。
// 如果函数返回错误,事务将被回滚;否则,事务将被提交。
// tx 参数是当前事务的 GORM DB 实例,应传递给所有仓库方法。
ExecuteInTransaction(fn func(tx *gorm.DB) error) error
ExecuteInTransaction(ctx context.Context, fn func(tx *gorm.DB) error) error
}
// gormUnitOfWork 是 UnitOfWork 接口的 GORM 实现
type gormUnitOfWork struct {
db *gorm.DB
logger *logs.Logger // 添加日志记录器
ctx context.Context
db *gorm.DB
}
// NewGormUnitOfWork 创建一个新的 gormUnitOfWork 实例
func NewGormUnitOfWork(db *gorm.DB, logger *logs.Logger) UnitOfWork {
return &gormUnitOfWork{db: db, logger: logger}
func NewGormUnitOfWork(ctx context.Context, db *gorm.DB) UnitOfWork {
return &gormUnitOfWork{
ctx: ctx,
db: db,
}
}
// ExecuteInTransaction 实现了 UnitOfWork 接口的事务执行逻辑
func (u *gormUnitOfWork) ExecuteInTransaction(fn func(tx *gorm.DB) error) error {
tx := u.db.Begin()
func (u *gormUnitOfWork) ExecuteInTransaction(ctx context.Context, fn func(tx *gorm.DB) error) error {
uowCtx, logger := logs.Trace(ctx, u.ctx, "ExecuteInTransaction")
tx := u.db.WithContext(uowCtx).Begin()
if tx.Error != nil {
u.logger.Errorf("开启数据库事务失败: %v", tx.Error) // 记录错误日志
logger.Errorf("开启数据库事务失败: %v", tx.Error) // 记录错误日志
return fmt.Errorf("开启事务失败: %w", tx.Error)
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
u.logger.Errorf("事务中发生 panic已回滚: %v", r) // 记录 panic 日志
logger.Errorf("事务中发生 panic已回滚: %v", r) // 记录 panic 日志
} else if tx.Error != nil { // 如果函数执行过程中返回错误,或者事务本身有错误,则回滚
tx.Rollback()
u.logger.Errorf("事务执行失败,已回滚: %v", tx.Error) // 记录错误日志
logger.Errorf("事务执行失败,已回滚: %v", tx.Error) // 记录错误日志
}
}()
@@ -52,7 +59,7 @@ func (u *gormUnitOfWork) ExecuteInTransaction(fn func(tx *gorm.DB) error) error
// 提交事务
if err := tx.Commit().Error; err != nil {
u.logger.Errorf("提交数据库事务失败: %v", err) // 记录错误日志
logger.Errorf("提交数据库事务失败: %v", err) // 记录错误日志
return fmt.Errorf("提交事务失败: %w", err)
}