9 行バージョンの使用
行が最初にストアに挿入される際や各更新の際、一意のバージョン・トークンが割り当てられます。バージョンは常にストアに書き込んだメソッドによって返されます(たとえば、Store.put()
は、トークンをputCallBack()
のオプションとして返します)。バージョン情報は、ストアから行を取得するメソッドによっても返されます。
バージョンが重要である理由は2つあります。
-
更新や削除を行う場合、行の値が変更されていない場合にのみ操作を行うことが重要な場合があります。これは、同時に行を操作するスレッドやプロセスが複数存在可能なアプリケーションでは特に有用です。この場合、行を読み取り、そのときにバージョンを確認します。その後、格納操作を実行できますが、バージョンが変更されていない場合にのみ格納操作が続行されます(これは通常、比較および設定(CAS)または読取り、変更、書込み(RMW)操作と呼ばれます)。これを保証するには、
Store.putIfVersion()
またはStore.deleteIfVersion()
を使用します。 -
クライアントが以前に書き込まれたデータを読み取る際、読取り操作をサービスするOracle NoSQL Databaseノードが以前の書込み情報で更新されていることを確認することが重要な場合があります。これは、以前に書き込まれたデータのバージョンを一貫性パラメータとして読取り操作に渡すことで行えます。一貫性の使用の詳細は、「一貫性保証」を参照してください。
バージョンは、Version
クラスを使用して管理されます。別のカプセル化クラス(ReturnRow
クラスなど)の一部として返される場合もあります。
次のサンプル・コードでは、行を取得し、バージョンが変更されていない場合のみ、その行をストアに書き込みます。
...
// Store handle configuration and open skipped for brevity
...
store.on('open', function () {
console.log('Store opened');
store.indexIterator('myTable', 'DoB', {},
function (err, iterator) {
if (err)
throw err;
else {
// Configure Iterator event done
iterator.on('done', function() {
store.close();
});
iterator.forEach(function (err, returnRow) {
if (err)
throw err;
else {
var version = returnRow.version;
/// Do work on the row here
store.putIfVersion('myTable',
returnRow.row,
version,
function (err) {
if (err)
throw err;
else
console.log("Row rewritten");
});
}
});
}
});
}).on('close', function() {
console.log('Store closed.');
}).on('error', function(error) {
console.log(error);
});
store.open();