Confirmé que simplemente cambiar las tablas de secuencias de MyISAM a InnoDB hace que se creen bloqueos de actualización en las tablas de secuencias después de update...set...=last_insert_id()
pero antes de que se haya comprometido la transacción. Estos bloqueos no se crean cuando se usan las secuencias MyISAM. Por lo tanto, el enfoque "fácil" podría tener un impacto negativo en el rendimiento.
Esto es lo que se me ocurrió. No estoy seguro de que esta sea la forma más fácil, pero está funcionando.
- Por esto
respuesta, elimine las tablas de secuencia existentes y redefínalas con una sola columna
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Cree un procedimiento almacenado que:a) tome el nombre de la secuencia como argumento, b) realice la inserción en la secuencia y c) devuelva LAST_INSERT_ID()
- Escriba una clase Java que amplíe
MySQLMaxValueIncrementer
y llama al procedimiento almacenado engetNextKey()
método. Estoy usando unSimpleJdbcCall
instancia para hacer esto. - Escriba una clase java que implemente
DataFieldMaxValueIncrementerFactory
y devuelve una instancia del paso n.º 3 degetIncrementer()
método - En la configuración por lotes, actualice
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
configuración para usar la fábrica de incrementadores del paso n.º 4