我正在编写一个可以进行事务查询的服务,(在这个问题中我将使用 GORM)
用户服务
type userService struct {
UserRepository repository.IUserRepository
TokenRepository repository.ITokenRepository
}
type IUserService interface {
WithTrx() IUserService
CommitTrx() error
RollbackTrx()
Create(ctx context.Context, name string) (*model.User, error)
...
...
}
这是该服务的一些实现
用户.go
func (s *userService) WithTrx() IUserService {
newService := &userService{
UserRepository: s.UserRepository.WithTrx(),
TokenRepository: s.TokenRepository,
}
return newService
}
func (s *userService) Create(ctx context.Context, name string) (*model.User, error) {
...
// s.UserRepository.Create()
// then return the user, error
...
}
而对于 UserRepository.WithTrx() 基本上只是返回接口本身
type psqlUserRepository struct {
DB *gorm.DB
}
type IUserRepository interface {
WithTrx() IUserRepository
CommitTrx() error
RollbackTrx()
Create(ctx context.Context, u model.User) (*model.User, error)
...
}
func (r *psqlUserRepository) WithTrx() IUserRepository {
return &psqlUserRepository{DB: r.DB.Begin()}
}
因此,当我需要用户服务来使用事务查询创建用户时,我只是:
trx:= userserviceInstance.WithTrx()
user, err := trx.Create(ctx, name)
// err handling and rollback
commitErr := trx.CommitTrx()
有没有类似的方法?这叫什么?我不确定这是否是创建事务查询的正确模式。