J'ai confirmé que le simple fait de changer les tables de séquence MyISAM en InnoDB entraîne la création de verrous de mise à jour sur les tables de séquence après le update...set...=last_insert_id()
déclaration mais avant que la transaction ait été validée. Ces verrous ne sont pas créés lors de l'utilisation des séquences MyISAM. L'approche "facile" pourrait donc avoir un impact négatif sur les performances.
Voici ce que j'ai trouvé. Je ne suis pas sûr que ce soit le moyen le plus simple, mais cela fonctionne.
- Par ceci
répondez, supprimez les tables de séquence existantes et redéfinissez-les avec une seule colonne
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Créer une procédure stockée qui :a) prend le nom de la séquence comme argument, b) effectue l'insertion dans la séquence, et c) renvoie LAST_INSERT_ID()
- Écrire une classe Java qui étend
MySQLMaxValueIncrementer
et appelle la procédure stockée dans legetNextKey()
méthode. J'utilise unSimpleJdbcCall
instance pour le faire. - Écrire une classe Java qui implémente
DataFieldMaxValueIncrementerFactory
et renvoie une instance de l'étape 3 degetIncrementer()
méthode - Dans la configuration par lots, mettez à jour le
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
configuration pour utiliser la fabrique d'incrémenteurs à partir de l'étape 4