9 行バージョンの使用
行が最初にストアに挿入される際や各更新の際、一意のバージョン・トークンが割り当てられます。バージョンは、ストアに書き込んだメソッド(Store.put()
など)によって必ず返されます。バージョン情報は、ストアから行を取得するメソッドによっても返されます。
バージョンが重要である理由は2つあります。
-
更新や削除を行う場合、行の値が変更されていない場合にのみ操作を行うことが重要な場合があります。これは、同時に行を操作するスレッドやプロセスが複数存在可能なアプリケーションでは特に有用です。この場合、行を読み取り、そのときにバージョンを確認します。その後、格納操作を実行できますが、バージョンが変更されていない場合にのみ格納操作が続行されます(これは通常、比較および設定(CAS)または読取り、変更、書込み(RMW)操作と呼ばれます)。これを保証するには、
Store.put_if_version()
またはStore.delete_if_version()
を使用します。 -
クライアントが以前に書き込まれたデータを読み取る際、読取り操作をサービスするOracle NoSQL Databaseノードが以前の書込み情報で更新されていることを確認することが重要な場合があります。これは、以前に書き込まれたデータのバージョンを一貫性パラメータとして読取り操作に渡すことで行えます。一貫性の使用の詳細は、「一貫性保証」を参照してください。
バージョンはPythonバイト配列として処理されます。管理に使用されるクラスまたはその他のデータ型はありません。場合によっては、Row.get_version()
などの特別なメソッドによってアクセスされます。
次のサンプル・コードでは、行を取得し、バージョンが変更されていない場合のみ、その行をストアに書き込みます。
def do_store_ops(store):
key_d = {}
try:
row_list = store.index_iterator("myTable", "DoB", key_d,
False)
if not row_list:
logging.debug("Table retrieval failed")
else:
logging.debug("Table retrieval succeeded.")
for r in row_list:
version = r.get_version()
###
### do work on the row here
###
store.put_if_version("myTable", r, version)
except IllegalArgumentException, iae:
logging.error("Table retrieval failed.")
logging.error(iae.message)