Potvrdil jsem, že pouhá změna sekvenčních tabulek MyISAM na InnoDB způsobí vytvoření aktualizačních zámků na sekvenčních tabulkách po update...set...=last_insert_id()
ale dříve, než byla transakce potvrzena. Tyto zámky se nevytvářejí při použití sekvencí MyISAM. Takže „snadný“ přístup by mohl mít negativní dopad na výkon.
Tady je to, na co jsem přišel. Nejsem si jistý, zda je to nejjednodušší způsob, ale funguje to.
- Za toto
odpověď, zrušte existující sekvenční tabulky a předefinujte je jedním sloupcem
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Vytvořte uloženou proceduru, která:a) vezme název sekvence jako argument, b) provede vložení do sekvence ac) vrátí LAST_INSERT_ID()
- Napište třídu java, která rozšiřuje
MySQLMaxValueIncrementer
a volá uloženou proceduru vgetNextKey()
metoda. PoužívámSimpleJdbcCall
příklad, jak to udělat. - Napište třídu java, která implementuje
DataFieldMaxValueIncrementerFactory
a vrátí instanci z kroku #3 zgetIncrementer()
metoda - V dávkové konfiguraci aktualizujte
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
konfiguraci pro použití továrny na inkrementaci z kroku #4