package repository import ( "context" "gorm.io/gorm" ) // TransactionManager 事务管理器接口 type TransactionManager interface { // RunInTransaction 在事务中执行函数 RunInTransaction(ctx context.Context, fn func(ctx context.Context) error) error } // gormTransactionManager GORM 事务管理器实现 type gormTransactionManager struct { db *gorm.DB } // NewTransactionManager 创建事务管理器 func NewTransactionManager(db *gorm.DB) TransactionManager { return &gormTransactionManager{db: db} } // RunInTransaction 在事务中执行函数 func (m *gormTransactionManager) RunInTransaction(ctx context.Context, fn func(ctx context.Context) error) error { return m.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { // 将事务 TX 存入 context ctxWithTx := context.WithValue(ctx, txKey{}, tx) return fn(ctxWithTx) }) } // txKey 事务 context key type txKey struct{} // GetTxFromContext 从 context 获取事务 TX func GetTxFromContext(ctx context.Context) *gorm.DB { if tx, ok := ctx.Value(txKey{}).(*gorm.DB); ok { return tx } return nil }