2012-11-30 10 views
11

Apache CassandraとJava EE 6を学習するための小さなWebアプリケーションを開発しています。 Cassandraバージョンは1.1.6です。Apache Cassandra counterから削除

は、私は(。cqlsh vを使用して3.0.0)カウンターとテーブルを作成し ...怒っ私を運転問題を抱えている

CREATE TABLE test (
    author varchar PRIMARY KEY, 
    tot counter 
) 

といくつかの値をこのように置く:

update test set tot = tot +1 where author = 'myAuthor'; 

あなたがこの行とtを削除しようとすると、列の家族は完全に、

author | tot 
----------+----- 
myAuthor | 1 

更新されるがもう一度同じキーで更新すると、何も起こりません!テーブルが更新されなくなった理由はわかりません。いったんキーを使用すると、それ以上使用できなくなったように見えます。 私はdatasaxのドキュメント(http://www.datastax.com/docs/1.1/references/cql/cql_lexicon)の手がかりを探しましたが、解決策を見つけることはできませんでした。

誰かが私を助けることができますか? ありがとうございました

+0

、私は_counter_ = _counter_ -1に設定_table_カウンター 更新を更新する必要が が、私の質問はありません:なぜ私はもう削除キーを使用することはできませんか? – besil

答えて

15

カッサンドラにはカウンターの削除に関する厳しい制限があります。あなたは本当にカウンターを削除することはできませんし、その後、短時間で再度使用することはできません。 Cassandra wiki

カウンタ除去は本質的に制限されています。たとえば、「インクリメント、削除、インクリメント」というシーケンスを非常に迅速に発行すると、削除が失われる可能性があります(何らかの理由で削除が最後に受信したメッセージの場合)。したがって、カウンタの削除は、削除されたカウンタが後で増分しないときにのみ、確定的な削除のために提供されます。これは、行の削除にも適用されます。カウンタの行を削除すると、削除前に存在していた行のカウンタを増やすと、不確定な動作が発生します。カウンタをリセットする必要がある場合は、残念ながら同時に安全ではないオプションの1つは、その値を読み取り、値を加算することです。再追加、削除カウンタキーに

+0

これを読む前に行を削除した場合、どのように修正しますか? – OrangeDog

1

ソリューションは、テーブルからのすべてのレコードを削除することです:

nodetool repair $table 
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;" 
sleep 1 
nodetool compact $table 

あなたが想像できるように、これはおそらく、実際のシステムでは実用的ではないはずです重要なカウンターが何らかの形で誤って削除された場合に緊急用に予約されてください。

これが起こり得ないことを確実にする方が良いです。私は、カウンタの値を変更したい場合は

関連する問題