Concurrencia Web Service REST ibatis Spring

Buen día a todos les comento mi problema. Tengo un proyecto web donde se hacen peticiones a los web service entre tantas de la peticiones hay una en particular que me esta dando muchos problemas y es el siguiente: Tengo una query que busca el máximo id de una columna + 1, en el método donde hago varias cosas al final mando a llamar esa query y justo después hago un insert a la base de datos con ese id que me devuelve la primer query. el problema es que hay ocasiones donde parece que se hace una peticion al mismo tiempo hora y segundo y en le asigna el (id + 1) a dos usuarios totalmente distintos cuando yo esperaria que sea el cosecutivo, eh utlizado varias notaciones en el método como este: @Transactional(rollbackFor = ServiceException.class, propagation = Propagation.NESTED, isolation = Isolation.READ_UNCOMMITTED) pero aun así el problema persiste.

Agradecería sus comentarios.

Gracias!!

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Concurrencia

Al menos ya adivinaste la causa del problema.

Ese mecanismo ya está comprobado que no sirve para aplicaciones concurrentes porque ocurre lo que te está pasando: pueden llegar varias peticiones al mismo tiempo y para todas se checa la tabla y no se ha insertado nada y si hay 1 registro entonces para todas calculas que el nuevo ID es 2. Ese mecanismo tiene otro problema incluso sin concurrencia: si borras registros, vas a tener id's repetidos. Estás tratando de inventar el hilo negro y no vas por buen camino.

Para resolver este problema, existen id's autoincrementables, secuencias y otras cosas en los servidores de base de datos. Si estás usando una base de datos que no tiene id's autoincrementables ni tiene secuencias, cámbiate a una base de datos de este siglo.

Si eso tampoco es una posibilidad y tienes que hacer a fuerzas esto a mano, utiliza una tabla separada para los id's, no uses la cuenta de registros. Es una simple tabla con dos valores: el nombre de la otra tabla (o cualquier identificador único, que sea la llave primaria de esta tabla) y una columna entera. Haces un query tipo SELECT seq FROM nuevo_id WHERE tabla='MITABLA' FOR UPDATE para bloquear ese registro, obtienes el último número usado, lo incrementas, haces UPDATE al mismo registro con el nuevo valor, y das commit para liberar el registro para los demás procesos; y ya tienes tu id para insertar un registro, mismo que nadie va a usar (y que si por alguna razón falla tu inserción, se desperdicia, pero no importa, a menos que encima de todo, tengas el requisito de que no hubiera huecos en la secuencia de id's).

Muchas gracias por tu

Muchas gracias por tu respuesta ezamudio me ayudo mucho!!!

Saludos.

generando archivo excel desde java....

Hola. Una disculpa por contactarlo de esta manera, espero no sea una molestia para usted. Tengo un problema, y necesito ayuda. Y se me ocurrió que seria una buena idea contactarlo.

El problema es el siguiente... Estoy generando un archivo de excel (*.xls) desde java, utilizando la librería jxl; pero no logro realizar los siguiente cambios desde el código java:

Quiero definir el tipo de hoja (carta u oficio}.
Definir la orientación (vertical u horizontal).
Establecer el factor de escala.
Y por último, mandar imprimir el archivo *.xls desde java.

Perdón por la molestia ocasionada, pero, ¿podría ayudarme? Gracias.