6

批处理语句在 cassandra 中是原子的是什么意思?准确地说,文档在本质上有点令人困惑。这是否意味着查询在集群中的节点之间是原子的?

比如说,我有一个包含 100 个查询的批次。如果批处理中的第 40 个查询失败,那么批处理中执行的 39 个查询会发生什么?

我知道在后台创建了一个批处理日志,它将处理部分批处理的一致性。它是否删除了其余 39 个条目并提供了批处理查询所需的原子性质。

在 MYSQL 中,我们将 autocommit 设置为 false,因此我们可以回滚。在这些情况下,cassandra 会回滚吗?

4

4 回答 4

3

原子性是基于协调器的。这意味着当您进行原子批量突变时,它将转到一个协调器。如果您的批次中的一个突变(在您的示例中为 40)由于负责它的副本已死而失败,则协调器将为该副本写入提示,并在死节点备份时将其交付。

但是,在一种情况下,您最终会应用一半的突变:如果协调器本身有问题。

要了解有关原子批处理的更多信息,请阅读以下内容: http ://www.datastax.com/dev/blog/atomic-batches-in-cassandra-1-2

于 2014-03-26T22:08:25.530 回答
3

它们实际上被称为记录批次而不是原子批次。在协调器开始写入之前,您获得的不仅仅是提示(任何写入都会获得),您还可以将批处理复制到其他 2 个节点。

不久前我写了一篇博客:http: //christopher-batey.blogspot.co.uk/2015/03/cassandra-anti-pattern-cassandra-logged.html

对于您的具体问题“它是否删除其余 39 个条目并提供批处理查询所需的原子性质”

不——Casssandra 没有回滚的概念。批处理日志副本将不断重试查询,直到全部成功。

于 2015-06-08T12:41:56.783 回答
1

最终一致是 C* 中的主要思想,他们以相同的方式设计批处理。与 SQL 世界中的事务不同,当失败发生时,批处理是“重放”而不是回滚。

这种设计差异是合理的,因为在 C* 中,添加比删除便宜。

需要注意的一件事是C* 中不允许隔离。也就是说,其他客户端可能仍会读取部分更新的值。

C* 中批处理的特性讨论页面 https://issues.apache.org/jira/browse/CASSANDRA-4285

于 2014-10-14T04:32:32.683 回答
0

原子批次应该像全有或全无。我不认为它应该只重播部分日志,因为它不与原子批处理定义一起使用。

-维维克

于 2014-03-26T18:55:56.237 回答