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

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

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

24 ответов

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

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

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

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

Ну а как же 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 по идее )

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

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

#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Карта сайта