Обработка условий гонки в MySQL DB - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю над созданием кошелька, который будет иметь некоторые кредитные и дебетовые транзакции.

Схема БД:

enter image description here

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

Одно из решений, которое мне пришло в голову, - это иметь блокировку кошелька для дебетов, т.е.когда приходит запрос на дебет, я блокирую его для сохранения в памяти, а когда приходит другой запрос на дебет, я проверяю блокировку.

Есть ли лучшее решение для этого.Мне пришло в голову другое решение - блокировка строк таблицы, но я не уверен, что смогу использовать это для своего случая.

Пожалуйста, помогите мне с лучшим и достойным решением для этого.Заранее спасибо.

1 Ответ

0 голосов
/ 14 декабря 2018
BEGIN;
a bunch of UPDATEs to subtract money from one place and add it to another.
if overdrawn, ROLLBACK
else COMMIT

Вам может потребоваться немного больше, чтобы избежать взаимоблокировок:

BEGIN;
SELECT ... FOR UPDATE;  -- the rows you need to look at and may need to update
... (tests)
UPDATE ... -- subtract money from here
UPDATE ... -- add that money to there
COMMIT;

Обязательно проверяйте наличие ошибок на каждом этапе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...