2017-03-02 5 views
0

に追加することにより、10進数の列を更新するために、私は次のようなカサンドラのテーブルを持っている:カサンドラ - どのように既存の値

create table position_snapshots_by_security(
securityCode text, 
portfolioId  int, 
lastUpdated  date, 
units   decimal, 
primary key((securityCode), portfolioId) 
) 

そして、私はこのような何かしたいと思います:

update position_snapshots_by_security 
    set units = units + 12.3, 
       lastUpdated = '2017-03-02' 
    where securityCode = 'SPY' 
    and portfolioId = '5dfxa2561db9' 

しかし、それは動作しません。

カッサンドラでこのような操作を行うことはできますか?最新バージョンの3.10を使用しています。

ありがとうございました!

J

答えて

2

それは読み取り前に書き込み(反)パターンを必要とするので、これはCassandraの(任意のバージョン)は不可能です。

counter columnsは、必要に応じてお試しください。アプリケーションレベルでキャッシング/カウントを試みることもできます。

アプリケーションレベルで読み取りを行う必要があります。そうでない場合は、クラスタのパフォーマンスが低下します。

2

カサンドラは書き込みの前に(Lightweight Transactionsを使用している場合を除いて)読み込みを行いませんので、既存の値に依存しているような操作をサポートしていません。これで、アプリケーションコードにCassandraを使用してを実行することは可能です。複数の作家がこの値を更新する可能性がある場合は、前述のLWTを使用して、値が正確であり、複数の作家が互いに踏み込んでいないことを確認したいでしょう。基本的には、以下の手順を実行してください。

  1. SELECTを使用してカッサンドラの現在の値を読み取ります。 LWTを使用している場合は、一貫性レベルがSERIALまたはLOCAL_SERIALであることを確認してください。
  2. アプリケーションコードの現在の値に加算する計算を行います。
  3. Cassandraの値をUPDATEステートメントで更新します。 LWTを使用している場合は、UPDATE ... IF value = previous_value_you_readとします。

LWTを使用している場合、計算中に読み込んだ以前の値が変更された場合、UPDATEは拒否されます。 (また、一連の手順をやり直すこともできます)。LWTは高価な操作です。特に、読んでいる/更新しているキーが大量に競合している場合は、注意が必要です。

希望に役立ちます!

関連する問題