Cassandra astyanax mutationbatch故障处理
我需要了解对MutationBatch.execute()的调用是否/如何对运行代码的服务器安全 请看下面的代码(从Astyanax示例中复制)。我打算使用此代码修改2个不同列族中的2行。我需要确保(100%)如果执行此代码的服务器在执行期间的任何时候崩溃/失败: -Cassandra数据存储中没有任何更改 -所有更改(2行)都应用于Cassandra数据存储 我特别关心行“OperationResult=m.execute();”。我假设这会转化为:将所有修改写入Cassandra中的提交日志,然后自动触发要在Cassandra内部执行的更改(Cassandra保证在某些服务器上执行) 非常感谢您在这方面的任何帮助 谢谢, 斯文 代码:Cassandra astyanax mutationbatch故障处理,cassandra,astyanax,Cassandra,Astyanax,我需要了解对MutationBatch.execute()的调用是否/如何对运行代码的服务器安全 请看下面的代码(从Astyanax示例中复制)。我打算使用此代码修改2个不同列族中的2行。我需要确保(100%)如果执行此代码的服务器在执行期间的任何时候崩溃/失败: -Cassandra数据存储中没有任何更改 -所有更改(2行)都应用于Cassandra数据存储 我特别关心行“OperationResult=m.execute();”。我假设这会转化为:将所有修改写入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);
}