domingo, 26 de junio de 2011

CONTROL DE CONCURRENCIA MULTIVERSION

    MVCC (Multi version concurrency control) es una técnica de concurrencia optimista en donde ninguna tarea o hilo es bloqueado mientras se realiza una operación en la tabla, porque el otro hilo usa su propia copia (versión) del objeto dentro de una transacción.

        Obviamente la implementación interna de este algoritmo es distinta en cada motor de bases de datos, a grandes rasgos se podría decir que el MVCC internamente lo que hace es identificar cada transacción con un numero univoco y a cada registro de la tabla, con un numero de versión, donde cada transacción trabaja con su copia y si se modifica un registro de una tabla, el contador de versión del registro se incrementa. 

      Si 2 transacciones modificaron la misma tabla, se hace un mergue de ambas tablas combinando las últimas versiones de cada registro. Si las 2 transacciones, modificaron exactamente el mismo registro, entonces en ese caso, cuando se realice el commit, el registro que finalmente queda, corresponde a la ultima transacción en realizar una modificación sobre ese registro.

      De esta manera se logra que una lectura no bloquee una transacción de escritura y que una transacción de escritura tampoco bloquee una transacción de lectura.

         Un ejemplo seria, cuando hago un SELECT, puedo simultáneamente hacer un UPDATE y cuando hago un UPDATE puedo hacer simultáneamente un SELECT, algo que en el isolation habitual de las bases de datos, no es posible.

       Es muy habitual usar este tipo modelo de concurrencia para evitar los famosos “deadlocks” que suelen ocurrir en bases de datos con mucha demanda.
Sin embargo, MVCC no debe ser usado en cualquier ocasión, ya que tiene un overhead muy importante.

      Todo el manejo de versionado tiene un alto costo, ya que las versiones de registros se copian y almacenan en tablas o estructuras físicas temporales que luego se descartan. 

     A medida que las operaciones de escritura sobre la base de datos cobran relevancia sobre las operaciones de lectura, y por otro lado, nuestras lecturas son largas, los beneficios de usar MVCC aumentan, ya que reducimos los bloqueos.

      Es fundamental la existencia de un alto grado de paralelismo en nuestra aplicación. MVCC es por definición, un modelo muy escalable y donde mejor se ven sus ventajas, es en escenarios de alta demanda.




































      La principal diferencia entre multiversión y el modelo de bloqueo es que en los bloqueos MVCC derivados de una consulta (lectura) de datos no entran en conflicto con los bloqueos derivados de la escritura de datos y de este modo la lectura nunca bloquea la escritura y la escritura nunca bloquea la lectura.

     En general la idea básica es que cuando una transacción modifica un dato, se crea una nueva versión del mismo, pero se guarda la anterior. De este modo, al acabar la ejecución de las transacciones, se puede utilizar para cada una de ellas la versión de los datos “que hace la ejecución correcta”, es decir, que hace la ejecución serializable. Lógicamente, estas técnicas requieren más espacio de almacenamiento para guardar las diferentes versiones.

Referencia Bibliograficas
http://manuales.gfc.edu.co/postgres/es/mvcc.html
http://ocw.uc3m.es/informatica/diseno-y-administracion-de-bases-de-datos/teoria/Tema4_6%28Administracion_Concurrencia%29.pdf
http://grimpidev.wordpress.com/2011/02/08/control-de-concurrencia-multiversion-mvcc/

1 comentario: