question

376752150_179413 avatar image
376752150_179413 asked Erick Ramirez edited

如何建立银行转账的模型?

账户A给账户B转100元. 应该如何建立模型?


感谢wdeng的分享:

“上面提到的银行账户余额这种使用场景,如果你需要准确跟踪余额变化的话,一个更好的办法是使用记账本(Ledger)的数据模型,也就是用一个时间序列的partition把每一笔增减变化都记录在这个账号下面的partition里面,然后周期性的加总,把余额总数放在一个static column里面。“

不过我还是不太理解。比如并发的情况下, 如何保证sql里的consistency (A和B的balance的总和不变)?

data modeling
10 |1000

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.

1 Answer

wdeng avatar image
wdeng answered wdeng edited

你引用的那一部分回答,主要讲的主题是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。

Share
10 |1000

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.