Mysql 高速交易系统中的衍生账户余额与存储账户余额

Mysql 高速交易系统中的衍生账户余额与存储账户余额,mysql,database,spring,Mysql,Database,Spring,我正在编写一个使用Mysql作为DBMS的SpringBoot2.x应用程序。我使用Spring数据和Hibernate。 我想为我的客户实现一个短信网关。每个客户在我的系统中都有一个帐户和一个余额 对于每个发送的sms,客户的余额必须通过sms成本进行分包此外,在发送短信之前,应检查余额,以确定客户是否有足够的信用(这意味着需要检查更新的余额)。 我想处理高比率的短信,因为客户是企业,而不仅仅是最终用户 因此,每个客户都可以在很短的时间内发送数百条短信。我正在寻找一种更新客户余额的有效方法。每

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

对于每个发送的sms,客户的余额必须通过sms成本进行分包此外,在发送短信之前,应检查余额,以确定客户是否有足够的信用(这意味着需要检查更新的余额)。

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

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

我可以从…中得出
选择金额(存款成本)的余额,但一旦我的系统中有数百万条记录,这将非常昂贵。
另一方面,如果我将余额的值保留在一列中,我将有两个问题:

  • 并发问题:我可能同时有许多事务需要更新余额。我可以使用悲观锁,但我会减慢整个系统
  • 数据的正确性:由于某些错误/未更新,余额可能错误
我可以在一天结束时运行任务来修复存储的余额和派生余额的值,但是:

  • 如果我有数百名客户,它可能会使我的系统停滞一段时间
  • 一些细心的客户可能会注意到他的余额变化,并要求解释。当你什么都不做的时候,你的平衡在没有解释的情况下改变是不好的

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

在银行业,人们对钱很小心。通常,“真理之地”是数据库。您可以创建“真理之地”内存,但这更复杂,需要并发内存数据库。如果你的服务器在事务中间掉了怎么办?您需要能够快速将数据库故障切换到备份

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

加快txn时间的常用方法是拥有一个线程池,并将一个线程分配给一个帐户。这样,帐户上的所有TXN始终由同一线程处理。这允许进一步优化