Isolement de transactions

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.

Présentation de l'isolement de transaction

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.

Lecture reproductible avec verrouillage pessimiste

Le niveau d'isolement de transaction lecture reproductible est le niveau par défaut. Ce niveau d'isolement empêche les lectures de pages modifiées et les lectures non reproductibles mais non les lectures fantômes. Une lecture de pages modifiées est une opération de lecture de données qui ont été modifiées par une transaction mais n'ont pas été validées. Une lecture non reproductible peut survenir lorsqu'aucun verrou en lecture n'a été obtenu lors de l'opération de lecture. Une lecture fantôme a lieu lorsque deux opérations de lecture identiques ont été effectuées mais que deux jeux de résultats ont été renvoyés en raison d'une mise à jour entre les opérations de lecture. Le produit obtient une lecture reproductible en maintenant les verrous S jusqu'à la fin de la transaction qui possède le verrou concerné. Etant donné qu'un verrou X n'est octroyé que lorsque tous les S sont libérés, toutes les transactions maintenant le verrou S obtiendront obligatoirement la même valeur lors de la relecture.
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();
Les lectures fantômes sont possibles lorsque vous utilisez des requêtes ou des index car les verrous ne sont pas obtenus pour des plages de données, uniquement pour les entrées de cache qui correspondent à l'index ou aux critères de requête. Par exemple :
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();

Lecture validée avec verrouillage pessimiste

Le niveau d'isolement de transaction de lecture validée peut être utilisé avec eXtreme Scale qui empêche les lectures de pages modifiées mais non les lectures non reproductibles ou les lectures fantômes ; eXtreme Scale continue ainsi à utiliser les verrous S pour lire les données de la mappe de cache mais libère immédiatement les verrous.
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");

Lecture non validée avec verrouillage pessimiste

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.