我有以下型号
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
不是孤立的操作,不确定构建它的最佳方法是什么,以及如何在保持从服务中抽象出数据库特定内容的同时传递事务。或者我应该只调用会话表插入查询(我*SessionsModel.CreateSession
直接放入*UsersModel.SignupUser
?
作为参考,事务pgx
通过调用*pgx.Conn.Begin()
which 返回一个具体的发生pgx.Tx
,您可以在其上执行与 *px.Conn 相同的功能,然后是*pgx.Tx.Commit()
or*pgx.Tx.Rollback()
我的问题是:
- 从哪里开始交易——模型还是服务?
- 如果在服务中,我如何在从服务中抽象出底层数据库的同时做到这一点?
- 如何在模型之间传递事务?