Jag bekräftade att bara ändring av MyISAM-sekvenstabellerna till InnoDB gör att uppdateringslås skapas på sekvenstabellerna efter update...set...=last_insert_id() uttalande men innan transaktionen har genomförts. Dessa lås skapas inte när du använder MyISAM-sekvenserna. Så det "enkla" tillvägagångssättet kan ha en negativ inverkan på prestandan.
Här är vad jag kom på. Inte säker på att detta är det enklaste sättet, men det fungerar.
- Per detta
svara, släpp de befintliga sekvenstabellerna och omdefiniera dem med en enda kolumn
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment - Skapa en lagrad procedur som:a) tar sekvensnamnet som ett argument, b) gör infogningen i sekvensen och c) returnerar LAST_INSERT_ID()
- Skriv en java-klass som utökar
MySQLMaxValueIncrementeroch anropar den lagrade proceduren igetNextKey()metod. Jag använder ettSimpleJdbcCallinstans för att göra detta. - Skriv en java-klass som implementerar
DataFieldMaxValueIncrementerFactoryoch returnerar en instans från steg #3 frångetIncrementer()metod - I batchkonfigurationen uppdaterar du
org.springframework.batch.core.repository.support.JobRepositoryFactoryBeankonfiguration för att använda inkrementerarens fabrik från steg #4