Jeg bekræftede, at blot ændring af MyISAM-sekvenstabellerne til InnoDB forårsager, at der oprettes opdateringslåse på sekvenstabellerne efter update...set...=last_insert_id()
erklæring, men før transaktionen er begået. Disse låse oprettes ikke ved brug af MyISAM-sekvenserne. Så den "lette" tilgang kan have en negativ indvirkning på ydeevnen.
Her er hvad jeg fandt på. Ikke sikker på, at dette er den nemmeste måde, men det virker.
- Per dette
svar, slip de eksisterende sekvenstabeller og omdefiner dem med en enkelt kolonne
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Opret en lagret procedure, der:a) tager sekvensnavnet som et argument, b) laver indsættelsen i sekvensen, og c) returnerer LAST_INSERT_ID()
- Skriv en java-klasse, der udvider
MySQLMaxValueIncrementer
og kalder den lagrede procedure igetNextKey()
metode. Jeg bruger etSimpleJdbcCall
instans for at gøre dette. - Skriv en java-klasse, der implementerer
DataFieldMaxValueIncrementerFactory
og returnerer en instans fra trin #3 fragetIncrementer()
metode - I batchkonfigurationen skal du opdatere
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
konfiguration til at bruge inkrementerfabrikken fra trin #4