トランザクション分離

トランザクションに関して、各バックアップ・マップ構成を、pessimistic、optimistic、または none の 3 種類のロック・ストラテジーのうちの 1 つ で構成できます。 pessimistic ロックおよび optimistic ロックを使用する場合、eXtreme Scale は 共有 (S) ロック、アップグレード可能 (U) ロック、および排他的 (X) ロックを使用して、整合性を維持します。 optimistic ロックは保持されないため、このロック動作が最も目立つのは pessimistic ロックを使用しているときです。3 つの トランザクション分離レベル (反復可能読み取り、読み取りコミット済み、および読み取りアンコミット) のうちの 1 つを使用して、 各キャッシュ・マップ内で eXtreme Scale が整合性を 保持するために使用するロック・セマンティクスを調整することができます。

トランザクション分離の概説

トランザクション分離 は、1 つの操作で行われた変更がどのように他の並行操作に可視に なるのかを定義します。

WebSphere eXtreme Scale でサポートされている 3 つの トランザクション分離レベル (反復可能読み取り、読み取りコミット済み、および読み取りアンコミット) を 利用して、eXtreme Scale が各キャッシュ・マップ内での整合性を保持するために使用するロック・セマンティクスを さらに調整できます。トランザクション分離レベルは、setTransactionIsolation メソッドを使用して Session インターフェースに設定されます。 トランザクション分離は、現在進行中のトランザクションがなければ、セッションの存続期間中いつでも 変更できます。

この製品では、共有 (S) ロックが要求および保持される方法を調整することによって、さまざまなトランザクション分離セマンティクスが 施行されます。トランザクション分離は、オプティミスティック・ロックまたはロックなしストラテジーを使用するように構成されたマップに対して、あるいはアップグレード可能 (U) ロックが取得される場合は何の影響もありません。

ペシミスティック・ロックでの反復可能読み取り

反復可能読み取り は、デフォルトのトランザクション分離レベルです。この分離レベル は、ダーティー読み取りおよび反復不能読み取りを防止しますが、 ファントム読み取りは防止しません。ダーティー読み取りとは、あるトランザクションによって 変更されたが、コミットされていないという状態のデータに対して発生する読み取り操作のことです。 反復不能読み取りは、読み取り操作実行時に読み取りロックが取得されていない場合に発生する 可能性があります。ファントム読み取りは、2 つの同一の読み取り操作が実行された が、操作と操作との間にデータに対する更新があったために 2 つの異なる結果セットが戻される場合に、 発生する可能性があります。この製品は、すべての S ロックを、ロックを所有するトランザクションが完了するまで保持し続けることに よって、反復可能読み取りを実現します。 X ロックは、すべての S ロックが解放されるまで認可されないため、S ロックを保持するすべてのトランザクションは、再読み取り時に同じ値を参照することが保証されます。
map = session.getMap("Order");
session.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session.begin();

// An S lock is requested and held and the value is copied into 
// the transactional cache.
Order order = (Order) map.get("100");
// The entry is evicted from the transactional cache.
map.invalidate("100", false);

// The same value is requested again.  It already holds the 
// lock, so the same value is retrieved and copied into the 
// transactional cache.
Order order2 (Order) = map.get("100");

// All locks are released after the transaction is synchronized
// with cache map.
session.commit();
ファントム読み取りが可能なのは、 照会または索引を使用しているときです。なぜなら、ロックはデータ範囲に対して取得されるのではなく、 索引または照会基準に一致するキャッシュ・エントリーに対してのみ取得されるからです。例:
session1.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session1.begin();

// A query is run which selects a range of values.
ObjectQuery query = session1.createObjectQuery
    ("SELECT o FROM Order o WHERE o.itemName='Widget'");

// In this case, only one order matches the query filter.  
// The order has a key of "100".
// The query engine automatically acquires an S lock for Order "100".
Iterator result = query.getResultIterator();

// A second transaction inserts an order that also matches the query.
Map orderMap = session2.getMap("Order");
orderMap.insert("101", new Order("101", "Widget"));

// When the query runs again in the current transaction, the 
// new order is visible and will return both Orders "100" and "101".
result = query.getResultIterator();

// All locks are released after the transaction is synchronized
// with cache map.
session.commit();

ペシミスティック・ロックでの読み取りコミット済み

読み取りコミット済みのトランザクション 分離レベルを eXtreme Scale で使用できます。 この分離レベルは、ダーティー読み取りを防止しますが、反復不能読み取りまたはファントム読み取りを防止しない ため、eXtreme Scale は S ロックを引き続き使用して キャッシュ・マップからデータを読み取りますが、すぐにロックを解放 します。
map1 = session1.getMap("Order");
session1.setTransactionIsolation(Session.TRANSACTION_READ_COMMITTED);
session1.begin();

// An S lock is requested but immediately released and
//the value is copied into the transactional cache.

Order order = (Order) map1.get("100");

// The entry is evicted from the transactional cache.
map1.invalidate("100", false);

// A second transaction updates the same order.
// It acquires a U lock, updates the value, and commits.
// The ObjectGrid successfully acquires the X lock during
// commit since the first transaction is using read
// committed isolation.

Map orderMap2 = session2.getMap("Order");
session2.begin();
order2 = (Order) orderMap2.getForUpdate("100");
order2.quantity=2;
orderMap2.update("100", order2);
session2.commit();

// The same value is requested again.  This time, they
// want to update the value, but it now reflects
// the new value
Order order1Copy (Order) = map1.getForUpdate("100");

ペシミスティック・ロックでの読み取りアンコミット

読み取りアンコミット のトランザクション分離レベルを eXtreme Scale で使用 できます。この分離レベルは、ダーティー読み取り、反復不能読み取り、およびファントム読み取りを許容します。