Estamos usando MySQL con el motor de almacenamiento InnoDB y transacciones, y nos encontramos con un problema: necesitamos una buena manera de emular las SECUENCIAS de Oracle en MySQL. Los requisitos son: - el soporte de concurrencia - seguridad de las transacciones - rendimiento máximo (que significa bloqueos y estancamientos minimizando)Emulando una SECUENCIA de transacción segura en MySQL
No importa si no se utilizarán algunos de los valores, es decir, huecos en la secuencia están bien. Hay una manera fácil de archivarlo creando una tabla InnoDB separada con un contador, sin embargo, esto significa que tomará parte en la transacción e introducirá bloqueos y esperas. Estoy pensando en probar una tabla MyISAM con bloqueos manuales, otras ideas o mejores prácticas.
Gracias - eso es más o menos lo que se nos ocurrió después de todo - procedimiento almacenado que hace casi exactamente eso. –
En caso de que ese registro no exista, utilice esta consulta. 'INSERT INTO sequence (seq_name, seq_current) VALUES ('foo', (@next: = 1)) ON DUPLICATE KEY ACTUALIZACIÓN seq_current = (@next: = seq_current + 1);' then call 'SELECT @next;' – iwat
es posible que desee combinar el comentario de iwat con la respuesta de qu1j0t3: 'INSERT INTO sequences2 (seq_name, seq_current) VALUES ('foo', LAST_INSERT_ID (1)) ON DUPLICATE KEY UPDATE seq_current = LAST_INSERT_ID (seq_current + 1);' luego, llame a 'SELECT LAST_INSERT_ID();', o si está utilizando un controlador de aplicación, use la función de autoincremento de la llamada (ej. 'Statement # getGeneratedKeys' en jdbc) – Alden