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では、書き込みは行レベルでアトミックです。つまり、特定の行キーの列の挿入または更新は、1回の書き込み操作として扱われます。Cassandraは、複数の行の更新を1つのオールオアナッシング操作にバンドルするという意味でのトランザクションをサポートしていません。

これは、100%確実にする方法がないことを意味します。つまり、ミューテーションによって2つの異なる行が更新されるか、まったく更新されません。しかし、Cassandra 0.8以降、少なくとも単一行内でそのような保証があります-単一行内で変更されたすべての列は成功するか、まったく成功しません-これがすべてです。

異なる行のミューテーションを個別のトランザクションとして見ることができます。それらが単一のミューテーション呼び出し内で送信されるという事実は、何も変更しません。Cassandraは内部的にすべての操作を行キーでグループ化し、各行の変更を個別のアトミック操作として実行します。

あなたの例では、rowKeyColumn1Column2)またはrowKey2Column1)が永続化されていることを確認できますが、両方が永続化されることはありません。

ヒント付きハンドオフ書き込みを有効にできます。これにより、書き込みが時間とともに伝播する可能性が高くなりますが、これもACIDDBではありません。

于 2012-08-08T11:46:48.983 に答える