170 похожих чатов

Господа, есть вопрос Вот есть условный доменный пакет в рамках DDD

и гексагона

При этом я хочу, чтобы при обработке запроса все изменения в бд были в рамках транзакции. Возникает вопрос - как организовать транзакцию внутри доменной логики (класса или там набора функций).
Доступ к БД передается как DI интерфейс. В теории сам домен не должен знать о том, что вообще такое транзакция, как ею управлять и т.п., т.к. это абстракция другого уровня (инфраструктурного).

Но при этом работать с ней как-то нужно. Я пришел к тому, что создавать транзакцию непосредтсвенно в хендлере, передавать в домен как параметр (DI интерфейс), а потом при ошибке в конце делать роллбек, иначе делать коммит.

Но при этом получается, что нужно протаскивать этот параметр DI интерфейса БД через все методы домена, что мне кажется очень некрасивым.

При этом у меня уровень БД реализован так, что один и тот же интерфейс реализует и просто класс с запросами к бд, и такой же класс, но который обращается не к бд напрямую, а через транзакцию. То есть я могу открыть транзакцию и передать ее как интерфейс, который для потребителя будет выглядеть просто как набор методов персистенции.

Что думаете? Нормально ли таскать транзакцию через все методы, либо лучше положить ее в контекст (он и так везде передается), либо создавать доменный объект вокруг транзакции?

16 ответов

2 просмотра

Паттерн Unit of work, клади в контекст флаг о том, что оно должно быть внутри транзакции.

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

Что-то вопрос не могу уловить, домен не должен знать о транзакции но управлять ей должен уметь?) Не выходит тут противоречия?

Nikita Gritsai
Что-то вопрос не могу уловить, домен не должен зна...

Домен не должен знать ничего про базу данных. А если использовать sql транзакции, то ты прям в коде домена будешь писать sql.Begin, sql.Commit и т.п.

Evgeny
Домен не должен знать ничего про базу данных. А ес...

Тоесть про транзакцию он ничего не знает, а про Save (aka Commit) может знать? Это не тоже самое другими словами?

Nikita Gritsai
Тоесть про транзакцию он ничего не знает, а про Sa...

Это не sql.Tx, это условный BusinessTx. То есть домен знает, что вот этот набор действий применяется одновременно. Но что там под капотом - домен не знает.

Evgeny
Это не sql.Tx, это условный BusinessTx. То есть до...

Транзакция концептуально есть, но она не инфраструктурная, а бизнесовая. В итоге ты можешь заменить базу на файлики, или postgres на redis, а домен останется неизменен, к примеру.

Ilya-Kaznacheev Автор вопроса
Evgeny
Это не sql.Tx, это условный BusinessTx. То есть до...

Попробую этот подход в одном из сервисов

Ilya Kaznacheev
Попробую этот подход в одном из сервисов

Я видимо на хабр статью про это напишу :D Давно хочу, на самом деле. "Как работать с бд в го", что-то такое. А то нездоровая популярность gorm меня пугает.

Evgeny
Я видимо на хабр статью про это напишу :D Давно хо...

Лучше на медиум. Нечего «этих» баловать.

Evgeny
Это каких?

Которые меня забанили

Ilya-Kaznacheev Автор вопроса
Alexey Popov
Лучше на медиум. Нечего «этих» баловать.

Тогда уж лучше на dev.to На медиум невозможно технические статьи писать без боли

Ilya-Kaznacheev Автор вопроса
Evgeny
Это не sql.Tx, это условный BusinessTx. То есть до...

Этот подход, кстати, хорошо зайдет как быстрое решение при постепенном рефакторинге кода Можно на стороне БД написать обертку с транзакциями, на стороне хендлеров - добавлять юнит в контекст, а все, что между - не трогать

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
t.me/<username> и tg://user?id=<id> отваливаются по понятным причинам
Denis 🐍|👑 | darling! 🥰
7
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
Карта сайта