Friday, October 31, 2014

Protocolo de control de concurrencia de Oracle




    En las bases de datos con un solo usuario, ese usuario puede modificar, consultar o eliminar la data sin tener que preocuparse porque otro usuario realice alguna operación sobre el mismo registro. Sin embargo, este problema está presente en las bases de datos multi usuario, por lo tanto existen los controles de concurrencia y controles de consistencia, los cuales son vitales para la base de datos, en esta entrada nos enfocaremos en los controles de concurrencia empleados por Oracle.


Bloqueos

    Oracle implementa una serie de bloqueos para controlar la ejecución concurrente de las transacciones, entre los bloqueos tenemos:


1. El bloqueo DML, se realiza para proteger los datos de ser modificados, existen varios tipos:
     a. Bloqueo por fila: Se bloquea toda la fila que se va a utilizar por la transacción. Este bloqueo permite un mayor grado de concurrencia porque hace posible que dos transacciones lean la misma tabla siempre que no modifiquen la misma fila.
     b. Bloqueo por tabla: Se bloquea toda la tabla a utilizar por la transacción. Este bloqueo a su vez, tiene unos tipos:
         i. Row Share (RS): este bloqueo indica que la transacción pretende realizar una actualización sobre las filas que acaba de bloquear.
         ii. Row Exclusive (RX): este bloqueo indica que la transacción ha realizado una o varias modificaciones en la fila. Se realiza un RX cada vez que se ejecuta un INSERT, UPDATE y DELETE.
         iii. Share (S): es un tipo de bloqueo que se realiza para bloquear una tabla y marcarla como “Solo lectura” momentáneamente. Varias transacciones pueden adquirir un share sobre la misma tabla simultáneamente.
         iv. Share Row Exclusive (SRX): sólo una transacción puede solicitar este bloqueo, consiste en no permitir ninguna actualización sobre una tabla, pero si la lectura.
         v. Exclusive (X): Es el bloqueo más restrictivo y consiste en bloquear completamente una tabla y no permitir ninguna sentencia DML que provenga de otra transacción.

2. El bloqueo DDL se utiliza para proteger los objetos de esquema en la base de datos mientras se realiza alguna sentencia sobre ellos. Sólo es posible bloquear un objeto a la vez, asegurando que nunca se bloquee el diccionario de datos completo. Existen varios tipos:
     a. Exclusivo: consiste en bloquear el objeto y no permitir ningún ALTER o DROP sobre él. Es el bloqueo más común ya que la modificación de objetos es una actividad crítica y se debe asegurar la consistencia de esta operación.
     b. Compartido: se utiliza para bloquear las tablas sobre las que se crea un procedimiento, asegurando que su estructura no va a ser cambiada mientras el procedure es compilado. Se permite la creación simultánea de procedures sobre las mismas tablas ya que esta sentencia no afecta la definición de las mismas.
     c. Bloqueos Internos: Oracle posee un sistema que bloquea la información vital en la base de datos, asi como las tablas, caches y Logs para evitar alguna manipulación inapropiada de data relativa al funcionamiento de la base de datos. Estos bloqueos son de bajo nivel y no pueden ser modificados por el usuario.

Protocolos de control optimistas

   Oracle tiene entre sus características el de usar protocolos de control optimistas, como todos los sistemas manejadores, ya que siempre se asume que no existirá ningún tipo de conflicto con las planificaciones, las técnicas consisten en revisar si hubo conflicto cuando la transacción esté parcialmente comprometida y se el protocolo se divide en 3 fases:
-Lectura: Se permite el acceso a las transacciones y sólo se revisa cuando estén a punto de finalizar, cualquier cambio se realiza en la memoria privada o local de las transacciones.
-Validación: Se comprueba que la secuenciabilidad de la planificación se mantenga.
-Escritura: En caso de no encontrar conflicto, se pasa lo que esté en la memoria privada a la base de datos. 

Control de concurrencia multiversión

    Oracle automáticamente provee consistencia en la lectura para una consulta en la que los datos que la consuta ve, vienen de un punto en el tiempo (consistencia de lectura a nivel de sentencia). Oracle también puede proveer consistencia de lectura para todos las consultas de una transacción (consistencia de lectura a nivel de transacción). 
    Para el manejo de versiones, Oracle implementa un sistema basado en SCN (System Change Number) que consiste en generar un número (relativo al tiempo del sistema) que sirva de referencia para marcar una transacción y que ésta sólo acceda a la versión de los datos con un SCN cercano al suyo, evitando así que las transacciones accedan a versiones modificadas de las tablas y asegurando la consistencia.


Niveles de aislamiento


    Uno de los protocolos que tiene Oracle para el control de la concurrencia y garantizar la consistencia, es el de niveles de aislamiento, para ello implementan los siguientes tres niveles: 

Nivel de AislamientoDescripción
Read committedÉsta es el nivel predeterminado de aislamiento, cada consulta ejecutada por una transacción sólo ve que la data que haya sido confirmada antes que la consulta empezara, por lo tanto una consulta de Oracle nunca tendrá lectura sucia de data.
SerializableLas transacciones serializables sólo ven cambios que fueron confirmados al momento de que la transacción empezara, además de esos cambios hechos por la misma transacción con lenguaje DML.
Read-onlyÉste nivel de aislamiento sólo ve los cambios al momento que la transacción empezara, sin embargo, no permite sentencias con INSERT, UPDATE or DELETE.


No comments:

Post a Comment