20.7.22.4. トランザクションとの競合の検出
トランザクションはキーの初期値を使用して競合を検出します。たとえば、トランザクションの開始時に「k」の値は「v」となります。準備フェーズでは、トランザクションはサーバーから "k" を取得して値を読み取ります。値が変更された場合、トランザクションは競合を回避するためにロールバックします。
トランザクションはバージョンを使用して、値の等価性を確認する代わりに変更を検出します。
forceReturnValue パラメーターは RemoteCache への書き込み操作を制御し、競合を回避するのに役立ちます。次の値があります。
-
trueの場合、書き込み操作を実行する前に TransactionManager はサーバーから最新の値を取得します。ただし、forceReturnValueパラメーターは、キーの初回アクセスの操作にのみ適用されます。 -
falseの場合、TransactionManager は書き込み操作を実行する前にサーバーから最新の値を取得しません。この設定があるためです。
このパラメーターは、最新の値が必要なため、replace や putIfAbsent などの 条件付き 書き込み操作には影響しません。
以下のトランザクションは、forceReturnValue パラメーターが競合する書き込み操作を防ぐ例を提供します。
トランザクション 1 (TX1)
RemoteCache<String, String> cache = ...
TransactionManager tm = ...
tm.begin();
cache.put("k", "v1");
tm.commit();
トランザクション 2 (TX2)
RemoteCache<String, String> cache = ...
TransactionManager tm = ...
tm.begin();
cache.put("k", "v2");
tm.commit();
この例では、TX1とTX2が並行して実行されます。「k」の初期値は「v」です。
-
forceReturnValue = trueの場合、cache.put()操作はサーバーから TX1 と TX2 の両方のサーバーから「k」の値を取得します。最初に「k」のロックを取得するトランザクションはコミットします。他のトランザクションは、「k」が「v」以外の値を持っていることをトランザクションが検出できるため、コミットフェーズ中にロールバックします。 -
forceReturnValue = falseの場合cache.put()オペレーションはサーバーから "k" の値を取得せず、null を返します。TX1 と TX2 の両方が正常にコミットされ、競合が生じます。これは、"k"の初期値が変更されたことをトランザクションが検知できないために発生します。
以下のトランザクションは、cache.put()オペレーションを行う前に「K」の値を読み取るcache.get()オペレーションが含まれます。
トランザクション 1 (TX1)
RemoteCache<String, String> cache = ...
TransactionManager tm = ...
tm.begin();
cache.get("k");
cache.put("k", "v1");
tm.commit();
トランザクション 2 (TX2)
RemoteCache<String, String> cache = ...
TransactionManager tm = ...
tm.begin();
cache.get("k");
cache.put("k", "v2");
tm.commit();
上記の例では、TX1 および TX2 の両方が鍵を読み取るため、forceReturnValue パラメーターは有効になりません。1つのトランザクションがコミットし、もう1つのトランザクションがロールバックします。ただし、cache.get() 操作には追加のサーバー要求が必要です。サーバーリクエストが非効率な cache.put() オペレーションの戻り値が必要ない場合。