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.
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