Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra astyanax mutationbatch故障处理_Cassandra_Astyanax - Fatal编程技术网

Cassandra astyanax mutationbatch故障处理

Cassandra astyanax mutationbatch故障处理,cassandra,astyanax,Cassandra,Astyanax,我需要了解对MutationBatch.execute()的调用是否/如何对运行代码的服务器安全 请看下面的代码(从Astyanax示例中复制)。我打算使用此代码修改2个不同列族中的2行。我需要确保(100%)如果执行此代码的服务器在执行期间的任何时候崩溃/失败: -Cassandra数据存储中没有任何更改 -所有更改(2行)都应用于Cassandra数据存储 我特别关心行“OperationResult=m.execute();”。我假设这会转化为:将所有修改写入Cassandra中的提交日志

我需要了解对MutationBatch.execute()的调用是否/如何对运行代码的服务器安全

请看下面的代码(从Astyanax示例中复制)。我打算使用此代码修改2个不同列族中的2行。我需要确保(100%)如果执行此代码的服务器在执行期间的任何时候崩溃/失败: -Cassandra数据存储中没有任何更改 -所有更改(2行)都应用于Cassandra数据存储

我特别关心行“OperationResult=m.execute();”。我假设这会转化为:将所有修改写入Cassandra中的提交日志,然后自动触发要在Cassandra内部执行的更改(Cassandra保证在某些服务器上执行)

非常感谢您在这方面的任何帮助

谢谢, 斯文

代码:

MutationBatch m=keyspace.prepareMutationBatch();
长rowKey=1234;
//在标准列中设置列
m、 withRow(CF_标准1,rowKey)
.putColumn(“Column1”,“X”,null)
.putColumn(“第2列”、“X列”为空);
m、 withRow(CF_标准1,rowKey2)
.putColumn(“Column1”,“Y”,null);
试一试{
OperationResult=m.execute();
}捕获(连接异常e){
日志错误(e);
} 

在Cassandra中,写入是行级别的原子操作,这意味着为给定行键插入或更新列将被视为一个写入操作。Cassandra不支持将多个行更新捆绑到一个all或nothing操作中的事务

这意味着,没有办法100%确定,突变将更新两个不同的行或没有。但由于Cassandra 0.8,您将至少在单行中得到这样的保证—在单行中修改的所有列都将成功或没有—仅此而已

您可以将不同行上的突变视为单独的事务,它们在单个突变调用中发送的事实不会改变任何事情。Cassandra在内部将所有操作分组到行键上,并将每个行变异作为单独的原子操作执行

在您的示例中,您可以确保
rowKey
Column1
Column2
)或
rowKey2
Column1
)已持久化,但决不能同时保留这两个选项


您可以启用暗示的切换写入,这将增加写入随时间传播的概率,但这不是ACID DB

自从Cassandra 1.2以来,我们现在有原子批处理突变?这是否仍然成立?
MutationBatch m = keyspace.prepareMutationBatch();

long rowKey = 1234;

// Setting columns in a standard column
m.withRow(CF_STANDARD1, rowKey)
    .putColumn("Column1", "X", null)
    .putColumn("Column2", "X", null);

m.withRow(CF_STANDARD1, rowKey2)
    .putColumn("Column1", "Y", null);

try {
    OperationResult<Void> result = m.execute();
} catch (ConnectionException e) {
    LOG.error(e);
}