【发布时间】:2021-11-04 03:04:38
【问题描述】:
我有以下型号
type UsersModel struct {
db *pgx.Conn
}
func (u *UsersModel) SignupUser(ctx context.Context, payload SignupRequest) (SignupQueryResult, error) {
err := u.db.Exec("...")
return SignupQueryResult{}, err
}
type SessionsModel struct {
db *pgx.Conn
}
func (s *SessionsModel) CreateSession(ctx context.Context, payload CreateSessionRequest) error {
_, err := s.db.Exec("...")
return err
}
我的服务调用 UsersModel.SignupUser 如下
type SignupService struct {
userModel signupServiceUserModel
}
func (ss *SignupService) Signup(ctx context.Context, request SignupRequest) (SignupQueryResult, error) {
return ss.userModel.SignupUser(ctx, request)
}
现在,我需要将 SignupUser 和 CreateSession 绑定在一个事务中,而不是孤立的操作,不确定构建它的最佳方法是什么,以及如何在保持对 DB 特定内容的抽象的同时传递事务服务。或者我应该只调用会话表插入查询(我直接在*SessionsModel.CreateSession 中放入*UsersModel.SignupUser?
作为参考,pgx 中的事务通过调用 *pgx.Conn.Begin() 发生,它返回一个具体的 pgx.Tx ,您可以在其上执行与 *px.Conn 相同的功能,然后是 *pgx.Tx.Commit() 或 *pgx.Tx.Rollback()
我的问题是:
- 从哪里开始事务 - 模型还是服务?
- 如果在服务中,我如何在从服务中抽象出底层数据库的同时做到这一点?
- 如何在模型之间传递事务?
【问题讨论】:
标签: go design-patterns pgx