Cassandra 卡桑德拉计数器表的原子更新与选择

Cassandra 卡桑德拉计数器表的原子更新与选择,cassandra,nosql,atomicity,Cassandra,Nosql,Atomicity,根据以下问题,我需要帮助/建议: 我有一个计数器表,它由异步进程递增。在增量更新之后,每个进程都需要新值。但这两个操作(更新和选择)不是原子操作。所以,有可能第二个过程在这段时间内做了进一步的增加。第一个过程的选择结果中的结果是错误的计数器值(计数器+2,而不是计数器+1)。我如何处理这个问题 如果我可以将更新和选择合并到一个原子事务中,那就太好了。2014年,已经有人要求提供此功能。但它似乎不会被实施: 你可以用Cassandra来完成这一点,但它的速度非常慢,而且是一种错误的解决方案。你有没

根据以下问题,我需要帮助/建议:

我有一个计数器表,它由异步进程递增。在增量更新之后,每个进程都需要新值。但这两个操作(更新和选择)不是原子操作。所以,有可能第二个过程在这段时间内做了进一步的增加。第一个过程的选择结果中的结果是错误的计数器值(
计数器+2
,而不是
计数器+1
)。我如何处理这个问题

如果我可以将更新和选择合并到一个原子事务中,那就太好了。2014年,已经有人要求提供此功能。但它似乎不会被实施:


你可以用Cassandra来完成这一点,但它的速度非常慢,而且是一种错误的解决方案。你有没有考虑过像一个有完整事务的数据库或者像redis这样的东西?同意。在与卡桑德拉合作时,先读后写应该是你心中的一个危险信号。如果您的应用程序不能容忍提供的一致性,那么用于此操作的辅助数据存储(如Redis)可能更适合。我需要这个计数器值作为另一个表中的唯一值(主键)(用于版本控制)。如果两个进程使用相同的计数器值将其数据写入此表,则一个条目将丢失。如何使用Cassandra更新和选择?您可以尝试在插入到辅助表中时使用轻量级事务。一个
如果不存在
应该可以实现你的目标(在你的应用程序中有额外的回退逻辑)。但是,这里还是要小心。我在尝试以这种方式喜欢Cassandra数据模型时遇到了很多麻烦。谢谢Matt!到目前为止,这将有所帮助:1。递增并获得计数器2<代码>如果不存在则插入3。通过
result.wasModified()
4检查成功。如果插入失败,请重新启动所有操作