Ho confermato che la semplice modifica delle tabelle di sequenza MyISAM in InnoDB provoca la creazione di blocchi di aggiornamento sulle tabelle di sequenza dopo update...set...=last_insert_id()
dichiarazione ma prima che la transazione sia stata confermata. Questi blocchi non vengono creati quando si utilizzano le sequenze MyISAM. Quindi l'approccio "facile" potrebbe avere un impatto negativo sulle prestazioni.
Ecco cosa mi è venuto in mente. Non sono sicuro che questo sia il modo più semplice, ma sta funzionando.
- Per questo
rispondere, eliminare le tabelle di sequenza esistenti e ridefinirle con una singola colonna
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- Crea una procedura memorizzata che:a) prenda il nome della sequenza come argomento, b) esegua l'inserimento nella sequenza e c) restituisca LAST_INSERT_ID()
- Scrivi una classe java che estenda
MySQLMaxValueIncrementer
e chiama la procedura memorizzata ingetNextKey()
metodo. Sto usando unSimpleJdbcCall
istanza per farlo. - Scrivi una classe java che implementi
DataFieldMaxValueIncrementerFactory
e restituisce un'istanza dal passaggio n. 3 dagetIncrementer()
metodo - Nella configurazione batch, aggiorna
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
configurazione per utilizzare la fabbrica dell'incrementatore dal passaggio n. 4