Ik heb bevestigd dat alleen het wijzigen van de MyISAM-reekstabellen naar InnoDB ervoor zorgt dat er updatevergrendelingen worden gemaakt op de reekstabellen na de update...set...=last_insert_id()
verklaring, maar voordat de transactie is gepleegd. Deze vergrendelingen worden niet gemaakt bij gebruik van de MyISAM-reeksen. De "gemakkelijke" benadering kan dus een negatieve invloed hebben op de prestaties.
Hier is wat ik bedacht. Ik weet niet zeker of dit de gemakkelijkste manier is, maar het werkt.
- Per dit
antwoord, verwijder de bestaande sequentietabellen en herdefinieer ze met een enkele kolom
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Maak een opgeslagen procedure die:a) de reeksnaam als argument neemt, b) de invoeging in de reeks doet, en c) LAST_INSERT_ID() retourneert
- Schrijf een Java-klasse die
MySQLMaxValueIncrementer
uitbreidt en roept de opgeslagen procedure aan in degetNextKey()
methode. Ik gebruik eenSimpleJdbcCall
instantie om dit te doen. - Schrijf een Java-klasse die
DataFieldMaxValueIncrementerFactory
implementeert en retourneert een instantie uit stap #3 van degetIncrementer()
methode - Update in de batchconfiguratie de
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
configuratie om de incrementerfabriek vanaf stap #4 te gebruiken