Aislamiento de transacciones

Para las transacciones, puede configurar cada configuración de correlación de respaldo con una de las tres estrategias de bloqueo: pesimista, optimista o ninguno. Si utiliza el bloqueo pesimista y optimista, eXtreme Scale utiliza bloqueos compartidos (S), actualizables (U) y exclusivos (X) para mantener la coherencia. Este comportamiento de bloqueo es más notable cuando se utiliza el bloqueo pesimista, porque los bloqueos optimistas no se conservan. Puede utilizar uno de los tres niveles de aislamiento de transacción para ajustar la semántica del bloqueo que utiliza eXtreme Scale para mantener la coherencia en cada correlación de memoria caché: lectura repetible, lectura confirmada y lectura no confirmada.

Visión general del aislamiento de transacciones

El aislamiento de transacciones define cómo los cambios realizados por una operación se vuelven visibles para otras operaciones simultáneas.

WebSphere eXtreme Scale soporta tres niveles de aislamiento de transacción con las que puede ajustar de forma adicional la semántica del bloqueo que utiliza eXtreme Scale para mantener la coherencia en cada correlación de memoria caché: lectura repetible, lectura confirmada y lectura no confirmada. El nivel de aislamiento de transacción se establece en la interfaz Session utilizando el método setTransactionIsolation. El aislamiento de transacción se puede modificar en cualquier momento durante el ciclo de vida de la sesión, si una transacción no está actualmente en progreso.

El producto aplica las distintas semánticas de aislamiento de transacción ajustando la forma en la que se solicitan y conservan los bloqueos compartidos (S). El aislamiento de transacciones no tiene ningún efecto en las correlaciones configuradas para usar las estrategias de bloqueo optimista o ningún bloqueo o cuando se adquieren bloqueos actualizables (U).

Lectura repetible con bloqueo pesimista

El nivel de aislamiento de transacción de lectura repetible es el valor predeterminado. Este nivel de aislamiento impide lecturas sucias y lecturas no repetibles, pero no impide las lecturas fantasma. Una lectura sucia es una operación de lectura que se produce en datos que han sido modificados por una transacción, pero no han sido confirmados. Una lectura no repetible se puede producir cuando los bloqueos de lectura no se adquieren al realizar una operación de lectura. Una lectura fantasma se puede producir cuando se realizan dos operaciones de lectura idénticas, pero se devuelven dos conjuntos distintos de resultados porque se ha producido una actualización de los datos entras las operaciones de lectura. El producto consigue una lectura repetible manteniendo los bloqueos S hasta que se complete la transacción que posee el bloqueo. Como un bloqueo X no se otorga hasta haberse liberado todos los bloqueos S, todas las transacciones que contienen el bloqueo S ven el mismo valor cuando se vuelven a leer.
map = session.getMap("Order");
session.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session.begin();

// Se solicita y se mantiene un bloqueo S y el valor se copia en
// la memoria caché transaccional.
Order order = (Order) map.get("100");
// La entrada se desaloja de la memoria caché transaccional.
map.invalidate("100", false);

// Se vuelve a solicitar el mismo valor. Ya contiene el
// bloqueo, por lo que se recupera el mismo valor y se copia en la
// memoria caché transaccional.
Order order2 (Order) = map.get("100");

// Se liberan todos los bloqueos después de sincronizar la transacción
// con la correlación de la memoria caché.
session.commit();
Las lecturas fantasmas son posibles si se utilizan consultas o índices, porque los bloqueos no se adquieren para los rangos de datos, sólo para las entradas de memoria caché que coinciden con los criterios de índice o consulta. Por ejemplo:
session1.setTransactionIsolation(Session.TRANSACTION_REPEATABLE_READ);
session1.begin();

// Se ejecuta una consulta que selecciona un intervalo de valores.
ObjectQuery query = session1.createObjectQuery
    ("SELECT o FROM Order o WHERE o.itemName='Widget'");

// En este caso, sólo un pedido coincide con el filtro de consultas.
// El pedido tiene una clave de "100".
// El motor de consultas adquiere automáticamente un bloqueo S para el pedido
"100".
Iterator result = query.getResultIterator();

// Una segunda transacción inserta un pedido que también coincide con la consulta.
Map orderMap = session2.getMap("Order");
orderMap.insert("101", new Order("101", "Widget"));

// Cuando se vuelve a ejecutar la consulta en la transacción actual, el
// nuevo pedido es visible y devolverá los pedidos "100" y "101".
result = query.getResultIterator();

// Se liberan todos los bloqueos después de sincronizar la transacción
// con la correlación de la memoria caché.
session.commit();

Lectura confirmada con bloqueo pesimista

El nivel de aislamiento de la transacción de lectura confirmada se puede utilizar con eXtreme Scale, que impide las lecturas sucias, pero no impide lecturas no repetibles ni lecturas fantasma, de forma que eXtreme Scale sigue utilizando los bloqueos S para leer los datos de la correlación de memoria caché, pero libera inmediatamente los bloqueos.
map1 = session1.getMap("Order");
session1.setTransactionIsolation(Session.TRANSACTION_READ_COMMITTED);
session1.begin();

// Se solicita un bloqueo S pero se libera inmediatamente y el
//valor se copia en la memoria caché transaccional.

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

// La entrada se desaloja de la memoria caché transaccional.
map1.invalidate("100", false);

// Una segunda transacción actualiza el mismo pedido.
// Adquiere un bloqueo U, actualiza el valor y lo confirma.
// ObjectGrid adquiere correctamente el bloqueo X durante
// la confirmación puesto que la primera transacción utiliza el aislamiento
// de lectura confirmada.

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

// Se vuelve a solicitar el mismo valor. Esta ver, se desea
// actualizar el valor, pero ahora refleja
// el nuevo valor
Order order1Copy (Order) = map1.getForUpdate("100");

Lectura no confirmada con bloqueo pesimista

El nivel de aislamiento de la transacción de lectura no confirmada se puede utilizar con eXtreme Scale, que es un nivel que permite las lecturas sucias, las lecturas no repetibles y las lecturas fantasma.