1

我需要了解对 MutationBatch.execute() 的调用是否/如何防止运行代码的服务器出现故障。

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

我特别关心“OperationResult result = 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);
} 
4

1 回答 1

2

http://www.datastax.com/docs/0.8/dml/about_writes

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

这意味着,没有办法 100% 确定,该突变将更新两个不同的行或不更新。但是自从 Cassandra 0.8 以来,您至少在单行内将有这样的保证 - 在单行内修改的所有列都将成功或不成功 - 仅此而已。

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

在您的示例中,您可以确保rowKey( Column1, Column2) 或rowKey2( Column1) 被持久化,但绝不会同时存在。

您可以启用提示切换写入,这会增加写入的可能性,写入会随着时间传播,但同样,这不是 ACID DB

于 2012-08-08T11:46:48.983 回答