我需要了解对MutationBatch.execute()的调用在运行代码的服务器上是否是安全的。
看看下面的代码(从Astyanax示例中复制)。我打算使用此代码修改两个不同列族中的2行。我需要确保(100%),如果执行此代码的服务器在执行过程中的任何一点崩溃/失败:- Cassandra数据存储中没有任何更改-所有更改(2行)都应用于Cassandra数据存储。
我特别关注行"OperationResult结果= m.execute();“。我假设这会转换成这样的内容:将所有修改写入Cassandra中的提交日志,然后原子地触发在Cassandra内执行的更改(而Cassandra保证在某个服务器上执行)。
在这方面的任何帮助都是非常感谢的。
谢了斯文。
代码:
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);
} 发布于 2012-08-08 11:46:48
writes
在Cassandra中,写在行级是原子的,这意味着为给定行键插入或更新列将被视为一个写操作。Cassandra不支持将多行更新捆绑到一个全或无操作的意义上的事务。
这意味着,没有办法100%确定,突变将更新两个不同的行或没有。但是,由于Cassandra0.8,您将有这样的保证,至少在单行内--在单行中修改的所有列都将成功或不成功--这就是全部。
您可以将不同行上的突变视为单独的事务,它们是在单个突变调用中发送的事实并不会改变任何事情。Cassandra内部将在行键上将所有操作组合在一起,并作为单独的原子操作执行每一行的变异。
在您的示例中,您可以确保rowKey (Column1,Column2)或rowKey2(Column1)被持久化,但永远不会两者兼而有之。
您可以启用暗示的汉道夫写,这将增加概率,写入将随着时间的推移,但再次,这不是酸性DB。
https://stackoverflow.com/questions/11846963
复制相似问题