La ejecución concurrente de varias transacciones debe garantizar que producirán el mismo resultado que las mismas en serie.
En general, las BD multi-usuarios utilizan bloqueos en el control de concurrencia. Niveles de bloqueo:
- Bloqueo Exclusivo: No permite que un recurso sea compartido. La primera transacción que lo bloquea es la única que puede alterarlo.
- Bloqueo Compartido: Permite que un recurso sea compartido. Muchas transacciones pueden adquirir este tipo de bloqueo sobre el mismo recurso.
Oracle utiliza además multiversión para permitir el acceso concurrente a los datos.
Control de Concurrencia Multiversión
Oracle automáticamente proporciona consistencia de lectura: datos que una consulta ve son de un mismo punto en el tiempo (consistencia de lectura a nivel de sentencia).
También se puede proporcionar consistencia de lectura a todas las consultas de una transacción (consistencia a nivel de transacción).
¿Cómo?
- Oracle utiliza la información existente en el segmento de anulación (Datos antiguos).
- Cuando una consulta comienza se le asigna un número (SCN).
- Datos leídos por una consulta tienen un SCN más pequeño.
- Bloques con SCN más alto (más reciente) son construidos con la información contenida en el segmento de anulación.
Oracle proporciona consistencia de Lectura a dos (2) niveles:
- Nivel de Sentencia:
- Oracle garantiza que los datos devueltos por una consulta son consistentes con respecto al tiempo en que empezó la consulta.
- Oracle observa el SCN (System Change Number) cuando la consulta entra en ejecución.
- Solo los datos aceptados antes de dichos SCN serán utilizados.
- Segmentos de anulación se utilizan para buscar versiones anteriores de los datos.
- Nivel de Transacción:
- Datos vistos por todas las consultas de una transacción son consistentes con respecto a un punto en el tiempo.
- Se debe indicar que la transacción es Read-Only.
- Si las transacciones son de sólo lectura, se actúa como en el caso anterior.
- Si existen otro tipo de consultas (modificar, borrar, insertar, etc.) se deben utilizar bloqueos.
Oracle proporciona tres (3) niveles de Bloqueo:
- Read-Committed: Nivel de aislamiento por defecto. Cada consulta de una transacción sólo ve los datos que fueron confirmados antes de que la consulta comenzara. Se producen lecturas no reproducibles.
- Serializable-Transaction: Solamente se ven los cambios realizados por transacciones confirmadas más cambios efectuados por ella misma.
- Read-Only: Transacciones de sólo lectura ven datos confirmados antes de empezar y no permiten modificaciones de los datos.
Para seleccionar uno de estos comandos al comienzo de una transacción, tenemos:
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- SET TRANSACTION ISOLATION LEVEL READ ONLY;
Para establecer un nivel de aislamiento para el conjunto de transacciones tenemos:
- ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
- ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
Elección de un nivel de aislamiento: los dos (2) niveles siguientes proporcionan un alto grado de concurrencia mediante la combinación de multiversión y bloqueos.
- Read-Committed:
- Nivel por defecto.
- Apropiado para la mayoría de las aplicaciones.
- Aplicaciones donde el índice de llegada de transacción es alto.
- Si es poco probable que se ejecute una misma consulta dos veces.
- Serializable:
- Adecuado cuando es poco probable que dos transacciones concurrentes modifiquen una misma fila.
- Cuando las transacciones de larga duración son principalmente de sólo lectura.
- No aparecen lecturas no reproducibles.
Bloqueos en Oracle:
Los Bloqueos son los mecanismos que utiliza Oracle para evitar que dos (2) transacciones accedan al mismo recurso.
Automáticamente Oracle obtiene los bloqueos necesarios cuando ejecuta alguna sentencia en SQL.
Oracle utiliza el nivel menos restrictivo guiándose por las siguientes reglas:
- Operaciones de lectura no esperan a las de escritura sobre los mismos datos.
- Operaciones de escritura no esperan a las de lectura sobre los mismos datos.
- Operaciones de escritura solamente esperan a otras operaciones de escritura que intentan modificar las mismas tuplas.
Se utilizan bloqueos a nivel de filas: una transacción espera cuando intenta modificar una fila modificada por una transacción no conformada. Oracle no escalona los bloqueos.
Interbloqueos: ocurren cuando dos o más usuarios están esperando datos bloqueados por los otros. Oracle automáticamente detecta situaciones de interbloqueo y los resuelve abortando una de las transacciones. Se detectan mediante grafos de espera.
No hay comentarios.:
Publicar un comentario