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

Вопрос простой. Понятно, что если есть один сервис, который просит

списать или положить бабло, то мы просто апдейтим запись. Е сли деклаин тоже апдейтим запись
А если таких сервисов 4 или 5?
То может быть таоке что в единицу времени ежечасно я заапрувил и снял деньги для одного сервиса(то есть сперв азабронировал деньги а потмо списал), а второй раньше забронировал и потом надо списать, то уже писывать нечего так как первый списал ранее.

Конкурентое списнаие денег баланса... Что тогда делать? Это задача базы или всё же решается в коде?


Нормально написал или не? Или по другому спросить?

13 ответов

8 просмотров

Звучит как проблема дабл спендинга

Можно на уровне базы, а можно распределённые локи сделать для этого

Slava-Pinchuk Автор вопроса

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

Slava-Pinchuk Автор вопроса
Пользователь 61a26
Через юних тайм

Сорян , а можете поконкретнее, не понял Вашу мысль. Напишите развёрнутые предложения... я не могу Вам в голову залезть, мы все мыслим по разному и это нормально.

Slava Pinchuk
Просто транзакции с разных сервисов к примеру тран...

А что мешает операции с балансом вынести в один сервис? У вас есть какое-то кол-во разных процессов со своими транзакциями, но вы ведь их потом всё равно сводите к общему виду InnerTransaction и пишете в базу. В этом случае у вас данный вопрос уже будет решаться лишь в рамках одного сервиса.

Slava-Pinchuk Автор вопроса
Kirill Penzin
А что мешает операции с балансом вынести в один се...

Вот для этого и нужны настоящие транзакции как в постгрес. Идея в том что транзакция гарантированно выполнит либо все операции, либо ничего. Ещё есть такое понятие как consistency, советую почитать потом. Есть коротко, то нужно открыть транзакцию, считать баналанс, если он ОК то вычесть в той же транзакции. Идея в том что если постгрес заметит что кто-то уже поменял баланс, то операция провалиться. ТО есть я хочу чтоб ыбаланс апедйтился в постгресе, зачем мне отдельный сервис. ПРосто я не знаю как работают транзакции которы ене завершены, например одна началасьа что вторая просит тоже начаться.. что тоггда, аналогия как с го рутинами и мьютексами? не думаю, хотся есть же согласованность атомарносьт ACID ...

SELECT … FOR UPDATE;

Slava Pinchuk
Вот для этого и нужны настоящие транзакции как в п...

Что я должен прочитать про consistency по-вашему? Вы говорите о распределённой системе, в которой хотите управлять сущностью баланса. Вам надо выдавать владение на него. Вариантов решения тут уйма. Если же не хотите распределённую, то вам всё правильно написали про БД. Вариантов разных локов — тьма.

Slava Pinchuk
Вот для этого и нужны настоящие транзакции как в п...

Зависит от уровня изоляции. На уровне SELECT .. FOR UPDATE; провала не будет, СУБД скажет ЩА ПОГОДИ

Slava-Pinchuk Автор вопроса
Kirill Penzin
Что я должен прочитать про consistency по-вашему? ...

Спасибо за любые конуструктивные мысли. Я ж не ради холивара, а ради решения спрашиваю.

Slava Pinchuk
Спасибо за любые конуструктивные мысли. Я ж не рад...

если нет претензий на распределенную БД используем СУБД и все

Slava Pinchuk
Спасибо за любые конуструктивные мысли. Я ж не рад...

Если весь процесс можно свести к транзакции в базе - надо всеми силами так и делать. Если микросервисы со своими базами или есть иные причины, из-за которых к транзакции свести нельзя - гуглить микросервисный паттерн saga. Но сочувствую.

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

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

#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
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Гляньте, че бывает: Сегодня по одному проекту одной вебстудии делал проект небольшой, на их хостинге. На Modx revo. В определенный момент , работая в админке, вдруг перестал р...
Artem
7
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
12
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Карта сайта