mysql - 高利率交易系统中的衍生账户余额与存储账户余额

标签 mysql database spring

我正在使用 Mysql 作为 DBMS 编写 Spring Boot 2.x 应用程序。我使用 Spring Data 和 Hibernate。 我想为我的客户实现一个短信网关。每个客户在我的系统中都有一个帐户和余额。

每发送一条短信,客户的余额必须减去短信费用。 此外,在发送短信之前应检查余额,以查看客户是否有足够的信用(这意味着需要检查更新的余额)。

我想要处理高速率的短信,因为客户是企业而不仅仅是最终用户。

因此,每个客户都可以在很短的时间内发送数百条短信。我正在寻找一种有效的方法来更新客户的余额。每笔交易都有一点价格,但我有很多。

我可以通过SELECT SUM(deposit-costs) FROM...来得出余额,但是一旦我的系统中有数百万条记录,这样做的成本将非常昂贵。 另一方面,如果我将余额值保留在一列中,则会遇到两个问题:

  • 并发问题:我可能同时有许多交易想要更新余额。我可以使用悲观锁,但会减慢整个系统的速度
  • 数据的正确性:由于某些错误/遗漏更新,余额可能会出现错误

我可以在一天结束时运行一项任务来缓解这些问题,以用派生余额的值来修复存储的余额,但是:

  • 如果我有数百名客户,我的系统可能会卡住一段时间
  • 一些细心的客户可能会注意到他的余额的变化,并可能要求解释。当你什么都不做时,你的余额在没有解释的情况下发生变化,这不太好

我正在寻找一些建议和最佳实践来遵循。最后几家大公司都在出售他们的服务“现收现付”,所以我想有一个通用的方法来处理这个问题。

最佳答案

在银行业,人们对金钱非常谨慎。一般来说,“真相所在”是数据库。您可以在内存中创建“真理所在”,但这更复杂,需要内存数据库中的并发。如果您的一台服务器在交易过程中出现故障怎么办?您需要能够快速将数据库故障转移到备份。

进行基准测试以查看数据库更新时间是否满足您的需求。有多种方法可以适度加速它们。如果这些比率在您可以接受的范围内,那么就这样做。这是最简单的。

加快交易时间的一种常见方法是使用线程池并将一个线程分配给一个帐户。这样,帐户上的所有交易始终由同一线程处理。这可以进一步优化。

关于mysql - 高利率交易系统中的衍生账户余额与存储账户余额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58665903/

相关文章:

MySQL 遍历表行,运行另一个查询,连接结果

php - 如何修复mysql随机错误

php - GROUP BY mysql 只显示一行。但也想要重复

java - 已经在事务中时启动 spring batch 作业

spring - Tomcat 9 Spring MVC 应用程序 JS 文件使用 header text/html 而不是 application/javascript 下载

java - 将 Feign 与 Hystrix 结合使用时如何允许 400 错误传播?

java - 无法通过java类连接到数据库

php - MYSQL:在地理空间查询中使用 VARCHAR 字段作为 POINT

sql - Oracle where 子句性能不佳

mysql - 在 MySQL 数据库中存储具有与另一个表相关的 id 的数组的最佳方法是什么?