Потвърдих, че простото променяне на таблиците с последователности на MyISAM на InnoDB води до създаване на ключалки за актуализиране на таблиците с последователности след update...set...=last_insert_id() изявление, но преди транзакцията да е била извършена. Тези заключвания не се създават при използване на последователностите MyISAM. Така че „лесният“ подход може да има отрицателно въздействие върху производителността.
Ето какво измислих. Не съм сигурен, че това е най-лесният начин, но работи.
- Съгласно това
отговор, премахнете съществуващите таблици с последователности и ги предефинирайте с една колона
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment - Създайте съхранена процедура, която:a) приема името на последователността като аргумент, b) извършва вмъкване в последователността и c) връща LAST_INSERT_ID()
- Напишете Java клас, който разширява
MySQLMaxValueIncrementerи извиква съхранената процедура вgetNextKey()метод. ИзползвамSimpleJdbcCallпример, за да направите това. - Напишете Java клас, който имплементира
DataFieldMaxValueIncrementerFactoryи връща екземпляр от стъпка #3 отgetIncrementer()метод - В груповата конфигурация актуализирайте
org.springframework.batch.core.repository.support.JobRepositoryFactoryBeanконфигурация за използване на фабриката на инкрементера от стъпка #4