MySQL - Manejo de Concurrencias

 
Vista:

Manejo de Concurrencias

Publicado por JC (2 intervenciones) el 15/02/2005 18:22:24
Hola, estoy desarrollando un sistema para una empresa de telemercadeo. El módulo para las teleoperadoras tiene que seleccionar un registro de la base de datos (MySQL) y no permitir que otra teleoperadora selecciones el mismo registro. Esto debe ser hecho transparentemente para la gente que trabaja con el módulo.

Hice una forma en VB6 con un botón para seleccionar el siguiente registro y luego que el registro es seleccionado lo actualiza con la fecha y hora en que ha sido seleccionado. El query de selección está ordenado por la fecha y hora y, al menos en teoría, si un registro ha sido seleccionado previamente antes de que pasen 3 horas no volverá a ser seleccionado. El query utilizado es el siguiente:

rs.Open "SELECT * from alhogar.diario WHERE nro_intentos < 5 && (conf_oper = 0 || conf_oper = 2) && ((fecha_conf_oper =" + fecha + " && if(hora_conf_oper+30000>240000,hora_conf_oper+30000-240000,hora_conf_oper+30000) <= " + hora_min + ") || fecha_conf_oper < " + fecha + " || fecha_conf_oper IS NULL) ORDER BY fecha_conf_oper DESC, hora_conf_oper DESC, nro_intentos ASC , direccion ASC LIMIT 1", conn

Desde luego, esta es una solo línea. las variables y campos son:

conf_oper: almacena si el cliente no ha sido llamado ("0"), si ha comprado el producto ("1"), si no ha contestado el teléfono ("2") o si rechazó el producto ("3").

fecha_conf_oper: fecha de la última llamada al cliente.
hora_conf_oper: hora de la última llamada al cliente.
fecha: fecha actual.
hora_min: hora contra la qu hay que verificar que han pasado 3 horas.
direccion: Dirección del cliente.

Después que el registro ha sido seleccionado se actuliza con el siguient query:

conn.Execute "UPDATE alhogar.diario SET nro_intentos=" + ni + ", fecha_conf_oper=" + fecha + ", hora_conf_oper=" + hora + " WHERE telefono_1=" + tel

Donde:
nro_intentos: Nro. de intentos para contactar al cliente
ni: toma el antiguo valor de intentos y se le suma uno.
fecha, hora: fecha y hora actuales.
telefono_1: teléfono del cliente.
tel: telefóno del cliente actual.

Soy muy nuevo en programación en MySQL y no se como se pueden manejar más fácilmente los problemas de concurrencia en lectura, así que desarrollé esos querys para hacer la tarea de colocar la gente recientemente llamada al final de la cola y la gente a la que han pasado al menos 3 horas al principio de la cola. Mientras más tiempo pase desde la última llamada más arriba en la cola se coloca al cliente.

El problema es que este query no ha funcionado. La gente recientemente llamada aparece en el tope de la cola y la gente que ha contestado el telefóno, para aceptar o rechazar el producto, aparece en la cola.

Me he visto en la necesidad de simular una cola circulara donde la gente que se ha llamado se coloca al final de la cola y no se vuelve a tocar hasta que se recorra todo el grupo de gente que conforma el listado. Mi jefe ha ejado pasar esto por necesidad, pero no es la forma ideal de trabajar.

No se si el retardo en escribir el registro tiene algo que ver con el problema o si algún tipo de caché en MySQL me está dando estos dolores de cabeza. Lo cierto es que hay registros que aparecen en el query que es imposible que aparezcan, a menos que el nuevo estado del registro no haya sido escrito para el momento que otra teleoperadora pide que se le asigne un nueo cliente. Sólo hay 5 teleoperadoras trabajando, así que no creo que el problema de retardos en la escritura sea tan grave.

Por favor, si conocen alguna manera de solucionar mi problema hágamelo saber. Muchas gracias!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder