Size: a a a

2020 June 30

ЛА

Локоть Анатолий... in Go-go!
Артур Саляхов
Я храню тразакции в неком TransactionStore. В контексте передаю идентификатор транзакии. В итоге дергаются два репозитория и передаётся им контекст с одним идентификатором. В репозитории достаётся нужная транзация из TransactionStore и запрос делается через нее. Если зафейлит одн запрос, то отменятся и все остальные в других репозиториях. Я вроде вам уже кидал ссылку на реализацию этого всего))
Идентификатор транзакции это что?
В database/sql чтобы запросы выполнить в транзакции, нужен sql.Tx. вы это передаёте в контексте и проверяете его перед выполнением запроса?
источник

Н

Никита in Go-go!
Zver
Разные задачи это.
Хочется понять почему. Вот с точки зрения бизнеса нам же неважно, куда мы технически идем. Да и что собой являет кэш по бизнесу?
источник

АС

Артур Саляхов... in Go-go!
Локоть Анатолий
Идентификатор транзакции это что?
В database/sql чтобы запросы выполнить в транзакции, нужен sql.Tx. вы это передаёте в контексте и проверяете его перед выполнением запроса?
https://github.com/qilin/crm-api/blob/master/pkg/transactor/store.go#L14

Вот пример. В данном случае идентификатор транзакции это uuid.
источник

Z

Zver in Go-go!
Никита
Хочется понять почему. Вот с точки зрения бизнеса нам же неважно, куда мы технически идем. Да и что собой являет кэш по бизнесу?
Запихивание разных сущностей в одну усложняет саму сущность и изменение ее.
источник

АС

Артур Саляхов... in Go-go!
Локоть Анатолий
Идентификатор транзакции это что?
В database/sql чтобы запросы выполнить в транзакции, нужен sql.Tx. вы это передаёте в контексте и проверяете его перед выполнением запроса?
В теории можно и его передавать в контексте. Но это выглядит не очень првильным. Поэтому есть просто мапа, где, грубо говоря, хранятся sql.Tx.
источник

АД

Алексей Долгов... in Go-go!
Никита
А если отмена зафейлит?)
допустим реализовать для репозитория Begin() и Commit() и RollBack(). при вызове Begin() репозиторий ничего не сохраняет в базу пока не получит подтверждения, для sql например транзакция будет открываться но внутри репозитория, не снаружи. Потом либо сохраняем, либо откатываем. Репозиторий реализует доступ к данным и их сохранение в идеале. Мы даже не должны знать в sql он хранит или в Redis, или имеет кэширующие прослойки. вся инфраструктура хранения внутри репозитория должна быть, не снаружи. я так вижу)
источник

Н

Никита in Go-go!
Артур Саляхов
Создать свою сущность транзакции и хранить в них подключение к двум базам. Если косякнет одна, то роллбечим оба подключения.
Имеет смысл. Если одна из баз не поддерживает транзакции?
источник

ЛА

Локоть Анатолий... in Go-go!
Артур Саляхов
https://github.com/qilin/crm-api/blob/master/pkg/transactor/store.go#L14

Вот пример. В данном случае идентификатор транзакции это uuid.
Каждый метод репозитория в вашем случае принимает параметр context.Context. а уже в контексте косвенно передается транзакция.
Понял, спасибо
источник

АС

Артур Саляхов... in Go-go!
Никита
Имеет смысл. Если одна из баз не поддерживает транзакции?
Значит не использовать ее для тех целей, где нужны транзакции))
источник

VS

Victor Safronov in Go-go!
транзакцию можно и явно аргументом в метод отдавать
источник

Н

Никита in Go-go!
Victor Safronov
транзакцию можно и явно аргументом в метод отдавать
Да, но в Го сложновато. Нет опциональных параметров
источник

Z

Zver in Go-go!
В контексте
источник

Н

Никита in Go-go!
Zver
В контексте
И контекст прямо в метод репозитория?
источник

Z

Zver in Go-go!
Ну контекст же передается в каждый метод
источник

ЛА

Локоть Анатолий... in Go-go!
Алексей Долгов
допустим реализовать для репозитория Begin() и Commit() и RollBack(). при вызове Begin() репозиторий ничего не сохраняет в базу пока не получит подтверждения, для sql например транзакция будет открываться но внутри репозитория, не снаружи. Потом либо сохраняем, либо откатываем. Репозиторий реализует доступ к данным и их сохранение в идеале. Мы даже не должны знать в sql он хранит или в Redis, или имеет кэширующие прослойки. вся инфраструктура хранения внутри репозитория должна быть, не снаружи. я так вижу)
Если все должно быть внутри репозитория, то вот такие совместные операции как я привел, что надо сделать в одной  транзакции изменение по сути двух сущностей приведет рано или поздно к созданию одного огромного репозитория, ТК подобных групповых операций может быть много и многие из них могут задействовать сразу много свщностей
источник

АД

Алексей Долгов... in Go-go!
Локоть Анатолий
Если все должно быть внутри репозитория, то вот такие совместные операции как я привел, что надо сделать в одной  транзакции изменение по сути двух сущностей приведет рано или поздно к созданию одного огромного репозитория, ТК подобных групповых операций может быть много и многие из них могут задействовать сразу много свщностей
зависит от сложности проекта. допустим потом нужно будет иметь транзакционность сразу для нескольких баз и что тогда? Если вы создаете транзакцию на уровень выше репозитория, возможно репозиторий и не нужен, пользуйтесь sql.DB
источник

Z

Zver in Go-go!
Никита
И контекст прямо в метод репозитория?
Либо, если у вас коллекция репозиториев, то можно
repos.Transact(func (repos Repositories) err {
   u, err := repos.Users.Update(u)
   if err != nil {
       return err
   }
   …
   return nil
})
источник

ЛА

Локоть Анатолий... in Go-go!
Алексей Долгов
зависит от сложности проекта. допустим потом нужно будет иметь транзакционность сразу для нескольких баз и что тогда? Если вы создаете транзакцию на уровень выше репозитория, возможно репозиторий и не нужен, пользуйтесь sql.DB
Репозиторий нужен всегда, зачем мне sql.db? Методы репозитория показывают действия с сущностями.
источник

AK

Anton Kucherov in Go-go!
- Aggregate is synonymous with transactional consistency boundary.
- A properly designed Aggregate is one that can be modified in any way required by the business with its invariants completely consistent within a single transaction.
- Every persistent Aggregate type will have a Repository. Generally speaking, there is a one-to-one relationship between an Aggregate type and a Repository.

Excerpt From: Vernon, Vaughn. “Implementing Domain-Driven Design”.
источник

АС

Артур Саляхов... in Go-go!
Anton Kucherov
- Aggregate is synonymous with transactional consistency boundary.
- A properly designed Aggregate is one that can be modified in any way required by the business with its invariants completely consistent within a single transaction.
- Every persistent Aggregate type will have a Repository. Generally speaking, there is a one-to-one relationship between an Aggregate type and a Repository.

Excerpt From: Vernon, Vaughn. “Implementing Domain-Driven Design”.
Читал про это. Но так и не заставил себя плодить такое количество аггрегатных репозиториев… Хорошо это или плохо - покажет время ))
источник