Потвърдих, че простото променяне на таблиците с последователности на 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