6.5.3. 戻り値
Cache インターフェースは java.util.Map を拡張するため、put(key, value) や remove(key) などの書き込みメソッドはデフォルトで以前の値を返します。
戻り値が正しくないことがあります。
-
Flag.IGNORE_RETURN_VALUE、Flag.SKIP_REMOTE_LOOKUP、またはFlag.SKIP_CACHE_LOADでAdvancedCache.withFlags()を使用する場合。 -
キャッシュに
unreliable-return-values="true"が設定されている場合。 - 非同期通信を使用する場合。
- 同じキーへの同時書き込みが複数あり、キャッシュトポロジが変更された場合。トポロジーの変更により、Red Hat Data Grid は書き込み操作を再試行し、再試行された操作の戻り値は信頼性がありません。
トランザクションキャッシュは、3 と 4 の場合、正しい以前の値を返します。しかし、トランザクションキャッシュには gotcha: in distributed モードもあり、read-committed 分離レベルは、繰り返し可能な読み取りとして実装されます。つまり、この"double-checked locking"例は機能しません。
Cache cache = ...
TransactionManager tm = ...
tm.begin();
try {
Integer v1 = cache.get(k);
// Increment the value
Integer v2 = cache.put(k, v1 + 1);
if (Objects.equals(v1, v2) {
// success
} else {
// retry
}
} finally {
tm.commit();
}
これを実装する適切な方法として、cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK).get(k) を使用します。
最適化されたロックを持つキャッシュでは、書き込みは古い以前の値を返すことができます。書き込みskew チェックでは、古い値を回避できます。詳細は、「 Write Skews 」を参照してください。