Tengo una tabla llamada tbl_jobs
que almacena los metadatos de algunas tareas en segundo plano que se ejecutan en la aplicación. El esquema es como:Entrada duplicada para la clave 'PRIMARY' en mysql
CREATE TABLE `tbl_jobs` (
`type` varchar(30) NOT NULL DEFAULT '',
`last_run_on` datetime NOT NULL,
`records_updated` text,
PRIMARY KEY (`type`,`last_run_on`),
UNIQUE KEY `index2` (`type`,`last_run_on`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
Siempre que una tarea se ejecuta realiza una entrada en la tabla con el type
que es un identificador único para diferentes puestos de trabajo, y la run time
records updated
en ese plazo.
Hay dos trabajos diferentes que se ejecutan al mismo tiempo con tipos: MAILER_UNLOCKED_REWARDS
y MAILER_ALMOST_UNLOCKED
.
Cuando estos trabajos intentan insertar sus entradas con la misma marca de tiempo, solo uno de ellos se inserta y el otro arroja una entrada duplicada para el error de clave.
Por ejemplo, los dos trabajos corrieron la siguiente:
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
que se ejecutó correctamente, pero cuando la segunda tarea se ha ejecutado el comando de inserción
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
Se lanzó el error
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
La clave principal es la combinación de type
y last_run_on
columnas
Si elimino la entrada para el primer trabajo, la inserción tiene éxito, es decir, está pidiendo que timestamp
sean únicos.
Sin embargo, el conflicto por el mismo timestamp
ocurre solo entre estos dos trabajos. Hay otros trabajos que se insertan para el mismo timestamp
.
¿Alguna idea sobre cuál podría ser el problema?
puede mostrar el 'show crear la tabla tbl_jobs' – jcho360
Sólo un comentario, yo recomendaría el uso de una clave sustituta. Puede tener más de una entrada cada segundo. – Kermit
Dado que una clave principal es necesariamente única, debe eliminar la línea 'UNIQUE KEY' de su script. – sp00m