Cassandra 2.0における軽量トランザクション(Lightweight transaction)の使い方

概要


Lightweight transactions in Cassandra 2.0 | DataStax


こちらの原文のアルゴリズム理解に有益な日本語資料と一部拙訳です。

Lightweight transaction in CQL

軽量トランザクションは、IF節を使って、INSERTにもUPDATEにも利用できる。
新しいユーザーを登録する例は以下のとおり。

INSERT INTO USERS (login, email, name, login_count)
values ('jbellis', 'jbellis@datastax.com', 'Jonathan Ellis', 1)
IF NOT EXISTS

このユーザーのパスワードを再設定する例は以下のとおり。

UPDATE users
SET reset_token = null, password = ‘newpassword’
WHERE login = ‘jbellis’
IF reset_token = ‘some-generated-reset-token’
  • 更新されるカラムは、IF節に出てくるコラムと同じである必要はない。
  • 軽量トランザクションは、内部のPaxosの状態を保持できる粒度である単一のパーティションに制限される。
  • もし存在している値が期待した値でなくトランザクションが失敗した場合、Cassandraは現在の値を含めてくれるので、余分なリクエストをせずにリトライするべきか終了するべきかを決定することができる。
  • ConsistencyLevel.SERIALは、Paxosの現在の(コミットされていないであろう)状態を読み取ることができるようにするために追加された。SERIAL readは、コミットされていない更新が進行中であることが分かったら、そのコミットの一部としてコミットする。
  • エラー処理の詳細については、コードおよびコメントを参照のこと。