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
MySQLMaxValueIncrementer
och anropar den lagrade proceduren igetNextKey()
metod. Jag använder ettSimpleJdbcCall
instans för att göra detta. - Skriv en java-klass som implementerar
DataFieldMaxValueIncrementerFactory
och returnerar en instans från steg #3 frångetIncrementer()
metod - I batchkonfigurationen uppdaterar du
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
konfiguration för att använda inkrementerarens fabrik från steg #4