Pour les transactions, vous pouvez configurer chaque configuration de mappe de sauvegarde à l'aide de l'une des trois stratégies de verrouillage : pessimiste, optimiste ou aucune. Lorsque vous utilisez les verrouillages pessimiste et optimiste, eXtreme Scale utilise des verrous partagés (S), pouvant être mise à niveau (U) et exclusifs (X) pour maintenir la cohérence. Ce comportement de verrouillage est plus marqué lors de l'utilisation du verrouillage pessimiste car les verrous optimistes ne sont pas maintenus. Vous pouvez utiliser l'un des trois niveaux d'isolement de transaction afin de paramétrer la sémantique de verrouillage utilisée par eXtreme Scale pour maintenir la cohérence dans chaque mappe de cache : lecture reproductible, lecture validée et lecture non validée.
L'isolement de transaction définir comment les modifications apportées par une opération deviennent visibles aux autres opérations simultanées.
WebSphere eXtreme Scale prend en charge trois niveaux d'isolement de transaction qui peuvent vous permettre de peaufiner le paramétrage de la sémantique de verrouillage utilisée par l'eXtreme Scale pour maintenir la cohérence dans chaque mappe de cache : lecture reproductible, lecture validée et lecture non validée. Le niveau d'isolement de transaction est défini sur l'interface Session à l'aide de la méthodesetTransactionIsolation. L'isolement de transaction peut être modifié à tout moment pendant la durée de vie de la session si une transaction n'est pas en cours d'exécution.
Le produit impose les divers aspects de la sémantique d'isolement de transaction en paramétrant la demande et le maintien des verrous (S) partagés. L'isolement de transaction n'a aucune incidence sur les mappes configurées pour utiliser les stratégies de verrouillage optimiste ou aucune ou lorsque des verrous (U) pouvant être mis à jour sont obtenus.
map = session.getMap("Order");
session.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session.begin();
// Un verrou S est demandé et maintenu et la valeur est copiée dans
// le cache transactionnel.
Order order = (Order) map.get("100");
// L'entrée est expulsée du cache transactionnel.
map.invalidate("100", false);
// La même valeur est demandée de nouveau. Elle contient déjà le
// verrou, donc la même valeur est extraite et copiée dans le
// cache transactionnel.
Order order2 (Order) = map.get("100");
// Tous les verrous sont libérés après la synchronisation de la transaction
// avec la mappe de cache.
session.commit();
session1.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session1.begin();
// Une requête qui sélectionne une plage de valeurs est exécutée.
ObjectQuery query = session1.createObjectQuery
("SELECT o FROM Order o WHERE o.itemName='Widget'");
// Dans ce cas, une seule commande correspond au filtre de requête.
// La commande a une clé de "100".
// Le moteur de requête obtient automatiquement un verrou S pour la commande "100".
Iterator result = query.getResultIterator();
// Une deuxième transaction insère une commande qui correspond également à la requête.
Map orderMap = session2.getMap("Order");
orderMap.insert("101", new Order("101", "Widget"));
// Lorsque la requête est réexécutée dans la transaction en cours, la
// nouvelle commande est visible et renvoie les commandes "100" et "101".
result = query.getResultIterator();
// Tous les verrous sont libérés après la synchronisation de la transaction
// avec la mappe de cache.
session.commit();
map1 = session1.getMap("Order");
session1.setTransactionIsolation(Session.TRANSACTION_READ_COMMITTED);
session1.begin();
// Un verrou S est demandé mais immédiatement libéré et
//la valeur est copiée dans le cache transactionnel.
Order order = (Order) map1.get("100");
// L'entrée est expulsée du cache transactionnel.
map1.invalidate("100", false);
// Une deuxième transaction met à jour la même commande.
// Elle obtient un verrou U, met à jour la valeur et valide.
// L'ObjectGrid obtient correctement le verrou X lors de la
// validation car la première transaction utilise l'isolement lecture
// validée.
Map orderMap2 = session2.getMap("Order");
session2.begin();
order2 = (Order) orderMap2.getForUpdate("100");
order2.quantity=2;
orderMap2.update("100", order2);
session2.commit();
// La même valeur est demandée de nouveau. Cette fois, la valeur doit être
// mise à jour mais elle reflète maintenant la
// nouvelle valeur
Order order1Copy (Order) = map1.getForUpdate("100");
Le niveau d'isolement de transaction lecture non validée peut être utilisé avec eXtreme Scale qui autorise les lectures de pages modifiées, les lectures non reproductibles et les lectures fantômes.