Cassandra 如何处理并发更新?

Posted

技术标签:

【中文标题】Cassandra 如何处理并发更新?【英文标题】:How Cassandra handles concurrent updates? 【发布时间】:2016-02-17 08:45:30 【问题描述】:

Cassandra 如何处理多个用户对同一密钥的并发更新? Cassandra 是否遵循 ACID 的“隔离”属性?

【问题讨论】:

【参考方案1】:

虽然不是真正符合 ACID,但 Cassandra 强制执行行级 isolation:

例如,如果一个用户正在编写包含两千列的行, 另一个用户可能会读取同一行并看到一些 列,但如果写入仍在进行中,则不是所有列。

完整的行级隔离已到位,这意味着写入一行 与执行写入的客户端隔离,对 任何其他用户,直到他们完成为止。

对于由不同协调器节点处理的竞争写入,每列值包含一个写入时间值,指示写入时间。这确保了最近对列的写入占用了单元格。换句话说,“最后写入获胜”。

【讨论】:

如果两个并发更新发生在分区内的同一行上,并且更新是在写入类型的更新之前读取的,会发生什么? Cassandra 的行级隔离是否确保这两个请求的更新是正确的?如果是,您能否提一下 Cassandra 是如何做到这一点的? @YugSingh 首先,read-before-write 操作是已知的 Cassandra 反模式。原因是您读取的值可能会在写入执行之前更改。由于行仅与客户端隔离,因此不会发生更新“正确性”的锁定或验证。在所有更新完成之前,其他任何人都看不到客户端应用程序更新一行中的多个列的写入。如果两个客户端在同一行上执行多列写入,则最新的写入时间戳(每列)将确定主要值。【参考方案2】:

Cassandra 为行级更新提供原子性和隔离性保证。您可以在 datastax blog article 中了解更多信息。

【讨论】:

以上是关于Cassandra 如何处理并发更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理磁盘上 Cassandra 中的空目录?

Mysql 和 java:当涉及到并发更新时如何处理多个用户

如何处理mysql数据库并发更新问题

如何处理高并发量的HTTP请求

如何处理大量数据并发操作

用一个示例讲解我是如何处理高并发的