Максимизация скорости обновления одной строки дб - PullRequest
0 голосов
/ 22 марта 2020

Я строю систему, используя java, пружинную загрузку, спящий режим, иногда необработанный sql, дб - mysql. У меня есть клиент в дБ, у которого есть баланс X. Его баланс не может go отрицательный.

Каждую секунду я могу получать около 200 заказов, которые влияют на баланс. Все 200 заказов от этого единственного клиента (он является агрегатором). Я запускаю транзакцию, выполняю определенные проверки, затем обновляю баланс

update customer set balance = balance - :amount where id = :customerId and balance >= amount

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

Это работает довольно хорошо, если я выполняю около 200 заказов. Я могу легко их обработать за секунду. Но если я поставлю в очередь, например, 400 заказов, я увижу, что транзакции начинают ждать слишком долго, пока они не получат свою очередь для обновления баланса.

Да, я могу поставить свой сервер sql на большую машину , но это также будет иметь некоторые ограничения. Я знаю, что есть шардинг, но я понятия не имею, как я могу применить шардинг для масштабирования моего единственного баланса. Что если бы у меня было 2000 заказов в секунду, и все они приходили от одного клиента? Просто мои 2000 заказов должны быть обработаны как можно быстрее. Но если слишком много транзакций будет работать вокруг этой единственной строки, они начнут тратить слишком много времени.

Я не прошу конкретное c решение, но если оно у вас есть, это действительно здорово. Но, может быть, вы знаете книгу или статью, которая поможет мне решить мою проблему?

...