Cassandra 卡桑德拉的原子批次

Cassandra 卡桑德拉的原子批次,cassandra,batch-processing,datastax-java-driver,cassandra-2.0,Cassandra,Batch Processing,Datastax Java Driver,Cassandra 2.0,在cassandra中,批处理语句是原子的是什么意思?确切地说,文档在本质上有点混乱。这是否意味着查询是跨集群中节点的原子查询 例如,我有一个包含100个查询的批处理。如果批处理中的第40个查询失败,那么批处理中执行的39个查询会发生什么情况 我知道在引擎盖下创建了一个批次日志,它将负责部分批次的一致性。它是否删除了其余39个条目,并提供了批处理查询所需的原子性质 在MYSQL中,我们将autocommit设置为false,因此可以回滚。在这些情况下,cassandra会回滚吗?原子批处理应该是

在cassandra中,批处理语句是原子的是什么意思?确切地说,文档在本质上有点混乱。这是否意味着查询是跨集群中节点的原子查询

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

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


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

原子批处理应该是全部或全无。我不这么认为,它应该只重放部分日志,因为它不符合原子批处理定义


-维韦克

原子性是以协调人为基础的。这意味着,当你进行一个原子批处理变异时,它将转移到一个协调人那里。如果批处理中的一个突变(在您的示例中为40)失败,因为负责该突变的复制副本已死亡,协调器将为该复制副本编写一个提示,并在死亡节点备份该复制副本时交付该复制副本

然而,有一种情况下,你最终会出现半应用突变:如果协调人本身有问题

要了解有关原子批处理的更多信息,请阅读以下内容:

最终一致性是C*的主要思想,他们以同样的方式设计批处理。与SQL世界中的事务不同,当出现故障时,批处理被“重放”而不是回滚

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

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

C中批处理的特性讨论页*

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

我不久前写了一篇关于这个的博客:

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


不-卡桑德拉没有回滚的概念。批处理日志副本将继续重试查询,直到全部成功

如果查询有问题,而不是节点有问题,情况如何。比如说,查询中有一个空值,第40个查询失败,因为它有一个空值。你的意思是说下面的批将永远不会被记录,并且错误将在批验证中被捕获?这就是未标记的批将要做的(提示)。记录的批处理可以做更多的事情。你在同一个分区中得到隔离,而不是在分区之间。它们被称为记录的批处理,但是一些博客/文档称它们为原子的。不确定你是否满意这些答案,因为到目前为止没有一个被接受。我的问题是,如果你指的是多分区或单分区批处理,因为它们的处理方式不同。我刚刚发表了一篇文章,解释了单分区批处理和多分区批处理之间的区别,希望这有助于更好地理解总体上的批处理: