账户A给账户B转100元. 应该如何建立模型?
感谢wdeng的分享:
“上面提到的银行账户余额这种使用场景,如果你需要准确跟踪余额变化的话,一个更好的办法是使用记账本(Ledger)的数据模型,也就是用一个时间序列的partition把每一笔增减变化都记录在这个账号下面的partition里面,然后周期性的加总,把余额总数放在一个static column里面。“
不过我还是不太理解。比如并发的情况下, 如何保证sql里的consistency (A和B的balance的总和不变)?
账户A给账户B转100元. 应该如何建立模型?
感谢wdeng的分享:
“上面提到的银行账户余额这种使用场景,如果你需要准确跟踪余额变化的话,一个更好的办法是使用记账本(Ledger)的数据模型,也就是用一个时间序列的partition把每一笔增减变化都记录在这个账号下面的partition里面,然后周期性的加总,把余额总数放在一个static column里面。“
不过我还是不太理解。比如并发的情况下, 如何保证sql里的consistency (A和B的balance的总和不变)?
你引用的那一部分回答,主要讲的主题是Counter这个数据类型不适合来存储银行账户余额的增减,但是准确的增减计数 可以用multi-row partition,用记账本(Ledger)的模型实现。但是,跟现在这个问题并没有多少关联。
Cassandra数据库内部没有实现ACID transaction,所以如果你需要实现账户A给账户B的转账,而且在分布式多节点甚至多数据中心的情况下完全保证这两个partition修改的一致性,是需要一些Cassandra层面之外的协调的。比如,Cassandra有一个特性叫LWT(Lightweight Transaction),也就是轻量级事务处理,它可以保证多个客户端访问同一个partition做到linearized的。你可以用这样的partition来实现一个锁机制,来保证两个账户修改的一致性。
另外,也有开源项目在Cassandra层面之上实现ACID Transaction的,比如这个开源项目https://www.slideshare.net/scalar-inc/transaction-management-on-cassandra 可以参考一下。
这个github repo(https://github.com/phact/dse-linearization)有一些开源代码演示怎样利用LWT来实现linearizable transaction。
5 People are following this question.
DataStax Enterprise is powered by the best distribution of Apache Cassandra ™
© 2023 DataStax, Titan, and TitanDB are registered trademarks of DataStax, Inc. and its subsidiaries in the United States and/or other countries.
Apache, Apache Cassandra, Cassandra, Apache Tomcat, Tomcat, Apache Lucene, Lucene, Apache Solr, Apache Hadoop, Hadoop, Apache Spark, Spark, Apache TinkerPop, TinkerPop, Apache Kafka and Kafka are either registered trademarks or trademarks of the Apache Software Foundation or its subsidiaries in Canada, the United States and/or other countries.
Privacy Policy Terms of Use