Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Acceso concurrente a tabla MyISAM

Estas en el tema de Acceso concurrente a tabla MyISAM en el foro de Mysql en Foros del Web. Hola a todos. Estoy desarrollando una aplicación que accede en lectura y escritura a unas tablas de tipo MyISAM y que tiene que convivir con ...
  #1 (permalink)  
Antiguo 24/08/2008, 23:54
 
Fecha de Ingreso: abril-2008
Mensajes: 23
Antigüedad: 16 años
Puntos: 0
Sonrisa Acceso concurrente a tabla MyISAM

Hola a todos.
Estoy desarrollando una aplicación que accede en lectura y escritura a unas tablas de tipo MyISAM y que tiene que convivir con otra ya construida que accede también en L/E a las mismas tablas. Las 2 aplicaciones deben poder estar en ejecución al mismo tiempo.
Tengo entendido que MyISAM no bloquea las tablas en las escrituras por lo que me surje la duda de como realizar mi aplicación para que no exista ningún problema con la otra, por ejemplo si las 2 intentan escribir en una misma tabla a la vez.
Os agradecería que me echarais una mano.
Un saludo.

PD: Todo esto siempre que la función Insert en MyISAM no bloquee automáticamente la tabla durante la inserción, si durante la inserción la tabla se bloquea para escritura no tengo problema.

Última edición por fernan3682; 25/08/2008 a las 05:40
  #2 (permalink)  
Antiguo 25/08/2008, 05:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Acceso concurrente a tabla MyISAM

MyISAM no soporta transacciones, desde ese punto de vista no tienes soluciones: Si no hay transacciones no hay aislamiento ni control de concurrencias. La única solución que tienes es migrar de modelo a InnoDB.
La única forma implementada de transacciones en MyISAM es en PHP y se muestra en esta página: Isotope: MyISAM Transactions., pero no es una transacción real sino emulada.

Si no puedes suprimir las MyISAM ... podrás resolver nada...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/08/2008, 06:08
 
Fecha de Ingreso: abril-2008
Mensajes: 23
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceso concurrente a tabla MyISAM

El problema es que no puedo cambiar el motor a InnoDB porque ya tengo la base de datos distribuida a los clientes.
Entonces, en caso de que ambas aplicaciones hicieran un INSERT a la vez a la misma tabla ¿que podría suceder?.
Gracias por la respuesta.
  #4 (permalink)  
Antiguo 25/08/2008, 06:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Acceso concurrente a tabla MyISAM

Es evidente: No tienes control de concurrencia, no tienes modo de evitar la falta de consistencia.
Tendrás la posibilidad de que en un mismo momento una aplicación escriba en una tabla y que otra borre el mismo registro....
En otras palabras, el peor escenario de una base de datos.
Las únicas soluciones que te quedan son:
1. Recodificar las aplicaciones para que escriban tablas temporales intermedias y que un proceso posterior realice la tarea de compatibilizar las operaciones.
2. Construir una capa de negocios intermedia que actúe de control de concurrencia artificial (es lo que en definitiva hace ese emulador).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/08/2008, 00:17
 
Fecha de Ingreso: abril-2008
Mensajes: 23
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceso concurrente a tabla MyISAM

Hola gnzsoloyo.
Sin embargo en la página de MySQL en el capítulo 7.3.1. (Internal Locking Methods ) (http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html) me ha parecido entender que MySQL tiene un sistema de bloqueo interno a nivel de tabla para MyISAM. En tal caso ¿se podría evitar la inconsistencia por inserciones simultaneas?
Gracias.
  #6 (permalink)  
Antiguo 26/08/2008, 06:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Acceso concurrente a tabla MyISAM

Técnicamente si. Es la única oportunidad que te dejas este tipo de tablas: El bloqueo a nivel de tabla.
En esencia es la misma problemática que se produce con la integridad referencial: Tienes que controlarla tu por programación.
En ese sentido, el gran inconveniente es que las operaciones de inserción se acumulan durante el bloqueo, por lo que deberás crear timers especiales o planificadores de colas de procesos para evitar que se produzcan bloqueos demasiado largos. Si ambas aplicaciones acceden para actualizar una tabla, una de las ,dos tomará el control y las inserciones o actualizaciones de la otra deberán esperar hasta que la otra la libere.
Este método (bloqueo de tablas) te puede ser útil, pero tendrás que programar muy fino, o harás que se produzcan deadlocks al azar.
El problema agregado, es que si una de las aplicaciones sólo lee, se puede poner un bloque que permita la lectura, pero eso no te asegura que la información no se a inconsistente entre dos lecturas al mismo registro; esto es simplemente porque entre la primera y la segunda lectura, la otra aplicación puede sobreescribir los datos leídos al inicio.

Puedes usar esta metodología, pero deberás profundizar en el estudio de concurrencia en las bases de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/08/2008, 06:26
 
Fecha de Ingreso: abril-2008
Mensajes: 23
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceso concurrente a tabla MyISAM

Ya lo voy teniendo más claro :)
Muchas gracias por las respuestas gnzsoloyo.

Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:41.