2016-10-20 4 views
1

カウンタをインクリメントして1回の呼び出しで値を戻す方法はありますか?カウンタのインクリメントと値の取得

2回の通話を行う唯一の方法はありますか?

+0

増分の前、増分の後、またはその前後の値を指定しますか? –

+0

@EliSadoff増分後の値が必要です。 –

+0

scalaに '++ '演算子がないので、カウンタをインクリメントしてから値を返さなければなりません。 –

答えて

2

これはファントムの制限ではありませんが、Cassandra APIの1つです。同じAPI呼び出しで値を取得して更新することはできません。その理由は非常にあります。

あなたはCQLは次のようになり、カウンタの値更新:

UPDATE keyspace.table SET counter = counter + 1 WHERE a = b; 

をしかし、離れてこのマスクは、真の分散ロックの複雑カサンドラは、一見単純なインクリメントを実行するために受けなければなりません。これは、すべてのカウントがlatestの値を更新していることを確認するのが本当に難しく、同じカウンタの複数のインクリメントが同じ値で終了するためです。

あなたは安全な読み取りを実行できる十分なレプリカによって書き込みが承認されていることを保証する必要があります。実際には、1つのカウンタの増分で行われるインクリメンタルなマージ/比較と設定のプロセスがあります。詳細はhereです。

読み出し動作が単純である:あなたがこれを行うことによって、多くのネットワークが賢明か複雑賢明を保存していると思われる場合

SELECT * FROM keyspace.table WHERE a = b; 

、あなたはおそらく、読み取りのボリュームがない限りではありません/計り知れない書き込みます。要するに、それは幸せな考えですが、私は気にしません。

for { 
    inc <- database.table.update.where(_.a = b).modify(_.counter increment 1).future() 
    value <- database.table.select(_.counter).where(_.a = b).one() 
} yield value 
関連する問題