14.3. ロックのタイプ

14.3.1. 楽観的ロックについて

楽観的ロックは、ロックの取得をトランザクションの準備時間まで延期することで複数のトランザクションが同時に終了するようにします。
楽観的モードは、複数のトランザクションが競合せずに終了するようにします。トランザクションは、他のトランザクションロックがクリアされるまで待機しなくてもコミットできるため、同時に実行されている複数のトランザクション間でほとんど競合が発生しない場合に適しています。writeSkewCheck が有効になっている場合、トランザクションが終了する前に、競合する変更が 1 つ以上データに加えられると、楽観的ロックモードのトランザクションはロールバックします。

14.3.2. 悲観的ロックについて

悲観的ロック (Pessimistic locking) は一括ロック (Eager locking) とも呼ばれます。
悲観的ロックは、クラスター全体のロックを各書き込み操作に適用することにより、複数のトランザクションでキーの値が変更されないようにします。ロックは、コミットまたはロールバックによってトランザクションが完了したときにのみ開放されます。
悲観的モードはキーで競合が発生し、効率が悪くなったり、予期されないロールバック操作が発生する場合に使用されます。

14.3.3. 悲観的ロックのタイプ

Red Hat JBoss Data Grid には、明示的な悲観的ロックと暗黙的な悲観的ロックが含まれています。
  • 明示的な楽観的ロックは、JBoss Data Grid Lock API を使用してトランザクションの期間にキャッシュユーザーがキャッシュキーを明示的にロックできるようにします。ロック呼び出しは、クラスターの全ノードにおいて、指定されたキャッシュキー上でロックの取得を試みます。ロックはすべてコミットまたはロールバックフェーズ中に開放されます。
  • 暗黙的な悲観的ロックは、キャッシュキーが変更操作のためアクセスされる時にキャッシュキーがバックグラウンドでロックされるようにします。暗黙的な悲観的ロックを使用すると、各変更操作に対してキャッシュキーが確実にローカルでロックされるよう JBoss Data Grid がチェックします。ロックされていないキャッシュキーが見つかると、JBoss Data Grid はロックされていないキャッシュキーのロックを取得するため、クラスターワイドのロックを要求します。

14.3.4. 明示的な悲観的ロックの例

以下は、キャッシュノードの 1 つで実行されるトランザクションの明示的な悲観的ロックの例になります。

手順14.3 明示的な悲観的ロックによるトランザクション

tx.begin()
cache.lock(K)           
cache.put(K,V5)         
tx.commit()
  1. cache.lock(K) が実行されると、K でクラスター全体のロックが取得されます。
  2. cache.put(K,V5) が実行されると、取得の成功が保証されます。
  3. tx.commit() が実行されると、この処理のために保持されたロックが開放されます。

14.3.5. 暗黙的な悲観的ロックの例

以下は、キャッシュノードの 1 つで実行されるトランザクションを使用する暗黙的な悲観的ロックの例になります。

手順14.4 暗黙的な悲観的ロックによるトランザクション

tx.begin()
cache.put(K,V)
cache.put(K2,V2)
cache.put(K,V5)
tx.commit()
  1. cache.put(K,V) が実行されると、K でクラスター全体のロックが取得されます。
  2. cache.put(K2,V2) が実行されると、K2 でクラスター全体のロックが取得されます。
  3. cache.put(K,V5) が実行されると、 K のクラスター全体のロックは以前取得されたため、ロックの取得は実行できませんが、put 操作は引き続き実行されます。
  4. tx.commit() が実行されると、このトランザクションのために保持されたすべてのロックが開放されます。

14.3.6. ロックモードの設定 (リモートクライアントサーバーモード)

Red Hat JBoss Data Grid のリモートクライアントサーバーモードでロックモードを設定するには、以下のように transaction 要素を使用します。
<transaction locking="{OPTIMISTIC/PESSIMISTIC}" />

14.3.7. ロックモードの設定 (ライブラリーモード)

Red Hat JBoss Data Grid のライブラリーモードでは、ロックモードが以下のように transaction 要素内で設定されます。
<transaction transactionManagerLookupClass="{TransactionManagerLookupClass}"
	     transactionMode="{TRANSACTIONAL,NON_TRANSACTIONAL}"
	     lockingMode="{OPTIMISTIC,PESSIMISTIC}"
	     useSynchronization="true">
</transaction>
トランザクションキャッシュに使用されるロックモードを設定するには、 lockingMode 値を OPTIMISTIC または PESSIMISTIC に設定します。