10 行バージョンの使用
行が最初にストアに挿入される際や各更新の際、一意のバージョン・トークンが割り当てられます。バージョンは、ストアに書き込んだメソッド(TableAPI.put()
など)によって必ず返されます。バージョン情報は、ストアから行を取得するメソッドによっても返されます。
バージョンが重要である理由は2つあります。
-
更新や削除を行う場合、行の値が変更されていない場合にのみ操作を行うことが重要な場合があります。これは、同時に行を操作するスレッドやプロセスが複数存在可能なアプリケーションでは特に有用です。この場合、行を読み取り、そのときにバージョンを確認します。その後、格納操作を実行できますが、バージョンが変更されていない場合にのみ格納操作が続行されます(これは通常、比較および設定(CAS)または読取り、変更、書込み(RMW)操作と呼ばれます)。これを保証するには、
TableAPI.putIfVersion()
またはTableAPI.deleteIfVersion()
を使用します。 -
クライアントが以前に書き込まれたデータを読み取る際、読取り操作をサービスするOracle NoSQL Databaseノードが以前の書込み情報で更新されていることを確認することが重要な場合があります。これは、以前に書き込まれたデータのバージョンを一貫性パラメータとして読取り操作に渡すことで行えます。一貫性の使用の詳細は、「一貫性保証」を参照してください。
バージョンは、Version
クラスを使用して管理されます。別のカプセル化クラス(Row
クラスなど)の一部として返される場合もあります。
次のサンプル・コードでは、行を取得し、バージョンが変更されていない場合のみ、その行をストアに書き込みます。
package kvstore.basicExample;
...
import oracle.kv.Version;
import oracle.kv.KVStore;
import oracle.kv.table.Index;
import oracle.kv.table.IndexKey;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;
...
// Retrieve the row. Note that we do not show the creation of
// the kvstore handle here.
TableAPI tableH = kvstore.getTableAPI();
Table myTable = tableH.getTable("myTable");
// Construct the IndexKey. The name we gave our index when
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();
TableIterator<Row> iter =
tableH.tableIterator(dobIdxKey, null, null);
while (iter.hasNext()) {
Row aRow = iter.next();
// Retrieve the row's version information
Version rowVersion = aRow.getVersion();
//////////////////////////
// Do work on the row here
//////////////////////////
// Put if the version is correct. Notice that here we examine
// the return code. If it is null, that means that the put was
// unsuccessful, probably because the row was changed elsewhere.
Version newVersion =
tableH.putIfVersion(row, rowVersion, null, null);
if (newVersion == null) {
// Unsuccessful. Someone else probably modified the record.
}
}