Friday, October 31, 2014

Concurrencia en Oracle

Primero que nada, ¿Que es la concurrencia? Bueno, la concurrencia en computación se refiere a la propiedad de los sistemas que permiten que múltiples procesos sean ejecutados al mismo tiempo, y que potencialmente puedan interactuar entre sí. La concurrencia se puede dar sólo cuando cada proceso o transacción es ejecutado en diferentes procesadores; sin embargo, esta puede ser simulada  en un solo procesador que se encarga de simular los procesos concurrentes, ocupándose de forma alternada de una y otro proceso en pequeños intervalos de tiempo.  

Este proceso deben garantizar que las operaciones que se ejecutan concurrentemente den los mismos resultados que si se ejecutaran 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.

Ahora bien, entrando en el tema de este blog, hablando sobre Oracle y su control de concurrencia, el cual es un modelo multiversion. Un modelo multiversion se refiere a un método para control de acceso generalmente usado por sistemas manejadores de base de datos para proporcionar acceso concurrente a los datos, y en lenguajes de programación para implementar concurrencia.
Oracle provee automáticamente una consistencia de lectura un query para que todos los datos que el query necesite provengan de un solo lugar al mismo tiempo; por lo tanto una consulta no verá ni datos basura ni cualquier cambio hecho por alguna transacción que haya realizado commit durante la ejecución del query (es decir, solo accede a los datos que hayan sido modificados o agregados y su transacción haya realizado commit antes de que la transacción que se desea ejecutar se inicie) . También provee una lectura de consistencia para los querys en una transacción, la cual se basa en que cuando una transaccion se ejecuate en modo serializable, toda los datos que modifique solo seran vistos por la transaccion que los realizo y no por todos los demas querys que vayan a ejecutar otras transacciones. 


Oracle usa la información que mantiene en su "segmento rollback" (figura de abajo) para proveer la consistencia. 


Este segmento contiene los valores antiguos de los datos que han sido cambiados por las transacciones que no hayan realizado commit o que ya lo hayan hecho. 

Oracle proporciona tres niveles de aislamiento (dos de ellos se hablaron antes):
 a) read-committed: Nivel de aislamiento por defecto. Cada consulta de una transacción solo ve los datos que fueron confirmados antes de que la consulta comenzara. Se producen lecturas no reproducibles.
b) serializable transactions: Solamente se ven los cambios realizados por transacciones confirmadas + cambios efectuados  por ella misma.
c) read-only : transacciones de solo 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:
·  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 siguientes:
·  ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
·  ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

También tenemos en Oracle los Bloqueos. Estos bloqueos son los que se utilizan para evitar que dos transacciones accedan al mismo tiempo al mismo recurso. 

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 la misma tupla.


Se utilizan bloqueos a nivel de fila: una transacción espera cuando intenta modificar una fila modificada por una transacción no confirmada.

ORACLE no escalona los bloqueos.

Un Interbloqueo ocurre 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 esperas.

No comments:

Post a Comment