альтернативой можем быть что-то наподобие следующего, когда коннект к базе данных является интерфейсом, и мы можем создать новый репозиторий с транзакцией и передать его в замыкание.
код
type UserRepo interface {
GetByID(...)
Save(...)
}
func (t *TX) InTx(ctx context.Context, f func(repo UserRepo)) error {
pool, ok := t.fb.(*DB)
tx, err := pool.Begin(ctx)
defer tx.Rollback(ctx)
f(ctx, NewUserRepo(tx))
tx.Commit(ctx)
}
есть свои минусы, например то, что в замыкании можно случайно вызвать репозиторий у которого коннект не в транзакции
альтернативой можем быть что-то наподобие следующего, когда коннект к базе данных является интерфейсом, и мы можем создать новый репозиторий с транзакцией и передать его в замыкание.
код
есть свои минусы, например то, что в замыкании можно случайно вызвать репозиторий у которого коннект не в транзакции