Inicio > MySQL > blankcorrea > Sincronizar pool de conexiones

Sincronizar pool de conexiones

Experto:
Usuario:
Fecha: 21/08/2008
Valoración: (5,00 sobre 5) Categoría: MySQL
13/08/2008
juanper1, usuario preguntando en MySQL
Usuario
Hola!
Verás! Me conecto a una base de datos MySQL a través de un pool de conexiones, y entre otras cosas inserto en dicha base de datos operaciones que poseen un identificador, el cual es un campo de tipo autoincrement. En el momento previo a insertar las operaciones obtengo el valor de ese identificador mediante SHOW TABLE STATUS LIKE 'operacion' porque necesito conocerlo, y seguidamente inserto la operación con un INSERT. Todo funciona bien, pero me ha surgido de repente una duda: ¿qué ocurre si dos usuarios van a insertar sendas operaciones a la vez? ¿Para ambos se obtendrá el mismo identificador? No sé si el propio pool de conexiones se encarga de esta sincronización, o si por el contrario debo encargarme yo. En ese caso... ¿cómo debería hacerlo? Por si sirve de algo, trabajo con Struts
Si hay algo que no entediste o no te quedó claro, dímelo. No siempre uno tiene por qué haberse explicado del todo bien :)
Gracias por adelantado
14/08/2008
juanper1, experto respondiendo en MySQL
Experto
Hola, en las versiones mas recientes de mysql ya vienen algunas validaciones de integridad referncial, es decir que si ocurre un error de identificadores te lo va a hacer saber y lo que tenes que hacer es capturar el error y mandarselo al usuario. MySql tiene en su manual todas las especificaciones de los errores y como capturarlo. Tenes que implementarlo en el lenguaje que utilizas y ya.
Espero que me haya explicado y cualquier cosa, no dudes en preguntarmelo.
15/08/2008
juanper1, usuario preguntando en MySQL
Usuario
Respecto a la integridad referencial... me has creado otra duda! Supongo que eso sí que lo hace por mí MySQL! Capturar el posible error que comentas en este sentido es simplemente capturar y manejar una SQLException, no? Eso sí que lo tengo hecho así!
Realmente mi duda iba más por lo de SHOW TABLE STATUS LIKE 'operacion', que utilizo para conocer el valor del autoincrement que tendrá la sentencia INSERT que va inmediatamente después. Imagínate 2 usuarios que a la vez van a insertar una operación. El primero obtiene un valor del SHOW... de 126, el segundo obtiene un valor también de 126 (supongo yo) porque aún el primero no ha insertado!, el primero inserta con un valor de autoincrement de 126, pero el segundo lo haría con un valor de 127 y ahí ya tendría yo un error lógico!, porque en las variables en las que guardé los valores de SHOW... tengo para ambos usuarios 126! Otra cosa es que el segundo trate de insertar también con valor de 126, que no sé si realmente sucedería así, y tendríamos el problema de integridad referencial que tú dices, y supongo que se lanzaría una SQLException que mi código sí capturaría, pero el problema que te planteo yo es el otro.
De todos modos he estado mirando en la red y he visto last_insert_id(). Ya me planteé usar esto en su momento para obtener el identificador de operación asignado por autoincrement tras el INSERT, y no sé por qué lo desestimé y acabé usando el SHOW TABLE..., pero lo he estado mirando de nuevo y, aparte de no encontrarle ahora la desventaja que le vi entonces, resuelve mi problema. Si dos usuarios van a insertar a la vez, primero inserta uno, luego el otro, se obtiene el last_insert_id() para el primero, y luego para el segundo. En este caso ambos last_insert_id() son distintos porque he leído que son particulares de cada conexión. En principio esto resolvería mi problema (salvo que le encuentre otra pega), pero me gustaría saber si estoy acertado en lo que te he comentado, y si el error de integridad referencial es capturado con la SQLException
Muchas gracias por tu ayuda
20/08/2008
juanper1, experto respondiendo en MySQL
Experto
Las ultimas versiones de mysql trae consigo tres caracteristicas nuevas (nuevas para mysql): integridad referencial, transacciones y bloqueo de registros. Cuando alguien este utilizando tu tabla, no va a poder se utilizado por otro usuario (bloqueo de registros), si ocurrio alguna excepción tenes la integridad referencial que no te va a permitir que se repita tu pk. Usa siempre las transacciones para que cuando ocurra un error no quede nada huerfano.
Cualquier duda estoy para escucharte.
21/08/2008
juanper1, usuario preguntando en MySQL
Usuario
Excelente. Una fantástica solución.
Más opciones
Enlaces patrocinados