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

Приветствую :) вопросик по транзакциям и агрегатам опять :) Простой

кейс: перевод денег с одного счета на другой. Две insert операции в базу. По идее 2 агрегата счетов двух пользователей. Как правильно поддержать консистентность в этом кейсе? Простое решение - все завернуть в одну транзакцию. Но ведь тут два агрегата, значит должно быть две отдельных транзакции. Делать конпенсационные действия в случае ошибки или делать какой то виртуальный агрегат "Счета", где как раз и будут такие операции проходить в одной транзакции и работа с счетами как с коллекциями (звучит бредово)?

24 ответов

8 просмотров
Павел-Г. Автор вопроса

Ну тут да :) я про самый простой вараинт, чисто в рамках монолита без внешний систем.

Транзакция и баста. Если хочется усложнять жизнь - сделать подсчёт балансов на основе переводов в первую очередь :) Тут же на самом деле первоочередной перевод, он же дифф, а баланс как поле юзера - просто некоторый «снэпшот». Но основной источник правды - переводы.

Павел-Г. Автор вопроса

Ну а как же 1 агрегат = 1 транзакция?... Или типо можно подзабить когда очень хочется? :)

https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C

Павел-Г. Автор вопроса

Спасибо 👍 почитаю

Агрегат же может быть пачкой сущностей, а тут по идее нам нужно именно что два счета атомарно изменить. И в терминах той же двойной записи (что скинули выше) - в одной транзакции может быть создано множество проводок, и заодно обновлено множество «снэпшотов» балансов.

для меня основное что они как раз независимо могут создаватся без необходимости транзакций и локов Ф двойная запись служит проверочным кодом котрый позволяет увидеть ошибку и устранить например руками или автоматически

Павел-Г. Автор вопроса

Ну вот я такой вариант обдумывал, но смущает, что у этого агрегата нет идентификатора. Или это агрегат транзакция... Короче я не знаю, поэтому спрашиваю)

Это не усложнение жизни а облегчение как раз в итоге)

Это не совсем правда. Встречаются вполне себе бизнесово атомарное множество проводок. Можно тут конечно пытаться это неатомарно делать в БД, но пока от этого больше сложности и проблем, нежели бонусов. Ну и опять же, снэпшоты балансов подбивать можно асинхронно, а в моменте смотреть на снэпшот+проводки. Но тут уже больше зависит от конкретных нагрузок, и тонкого тюнинга.

Да не все используют SQL базы даных ВОт вам DynamoDb в руки и баста Не люблю юизнес логику завязывать на базу данных а не на код.

С мой точки зрения, тут есть перевод/платеж/транзакция, и в рамках него есть множество проводок(это если про двойную запись говорить).

> Вот вам DynamoDb в руки и баста А я люблю брать инструмент под задачу, а не задачу на инструмент натягивать 🙂 SQL отлично для финансов заходит, особенно там - где и хочется иметь все эти гарантии SQL.

Та я же не против как пример привел Это нормально перекладывать на бызу данных твественность ибо доверять современным разработчикам такое себе решение 😄

ну да ну да, овердрафты например

https://www.youtube.com/watch?v=gpam7RGPFk8&ab_channel=JOnTheBeach

Овердрафты же про знак баланса, и именно что уже "бизнесовые" требования/ситуации в реальном мире. В моем случае от БД мне нужны именно что транзакционность да FK по большому счету.

Спасибо, гляну, может чего открою для себя еще

двойная запись появилась за миллиард лет до ДДД, программирования и компьютеров, зачем придумывать велоспиед)

Подождите, двойная запись - это хорошо! Я лишь про то, что в ней иногда хочется сами записи добавлять атомарным батчем

а еще хочется быстро производить расчеты

Безусловно, но на пути расчета еще отрабатывает различный антифрод/ТМ, коммуникации вообще со внешними платежными сервисами, что занимает много больше времени, что атомарный инсерт в SQL DB, я не прав?

да, занимает, и если это затрагивает 0.1% пользователей то можно проектировать систему так что бы остальным 99.9% ждать не надо было

Вот в моем случае это занимает 100% пользователей, как и у какого-нибудь Mastercard по идее )

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
How to create an OS in C? what to study?
Linus
18
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Народ, с прошедшими и наступающими. Ща полную ересь прогоню, но фишка в том, что это не обычная алкогольная ересь Либера, а я реально хз что делать. Сайт с 2012-го года Косяк...
Alexey Liber
1
Карта сайта