将事务存储到 NoSQL 数据库中

Storing transactions into a NoSQL Database

我们正在计划下一个项目并考虑将事务存储到 NoSQL 数据库中。基本上它是一个应用程序,用户可以在其中收集一些积分(如回报),然后用积分支付。

主要想法是将交易本身存储到 noSQL 数据库中,mysql服务器只存储当前余额。

所以我的问题是这是处理该问题的好方法还是我应该只使用 mysql 数据库?

我考虑使用 noSQL 的问题是,我们假设在短时间内有很多查询。

使用多语言持久性会增加操作负载,因此如果可以用一个数据存储来解决任务,那么最好不要引入额外的实体。

在您的情况下,您似乎希望拥有可审计的交易历史记录、一致的当前余额并且您不想放弃交易保证。的确,几乎所有现代 NoSQL 解决方案都不支持开箱即用的 ACID 事务,但它们中的大多数都支持允许您在应用程序级别实现事务的原语。

如果数据存储支持每个键的线性化和比较并设置(文档级原子性),那么它就足以实现客户端事务,而且您还有几个选项可供选择:

  1. 如果你需要Serializable隔离级别那么你可以遵循Google用于Percolator system or Cockroach Labs for CockroachDB. I've blogged about it and create a step-by-step visualization的相同算法,我希望它能帮助你理解背后的主要思想算法。

  2. 如果您预计会有高争用,但您可以使用 Read Committed 隔离级别,那么请查看 Peter Bailis 的 RAMP transactions

  3. 第三种方法是使用补偿事务,也称为 saga 模式。在 80 年代后期的 Sagas paper but became more actual with the raise of distributed systems. Please see the Applying the Saga Pattern 灵感演讲中对其进行了描述。