Confirmei que apenas alterar as tabelas de sequência MyISAM para InnoDB faz com que bloqueios de atualização sejam criados nas tabelas de sequência após o
update...set...=last_insert_id() declaração, mas antes que a transação tenha sido confirmada. Esses bloqueios não são criados ao usar as sequências MyISAM. Portanto, a abordagem "fácil" pode ter um impacto negativo no desempenho. Aqui está o que eu inventei. Não tenho certeza se esta é a maneira mais fácil, mas está funcionando.
- Por este
responda, elimine as tabelas de sequência existentes e redefina-as com uma única coluna
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment - Crie um procedimento armazenado que:a) receba o nome da sequência como argumento, b) faça a inserção na sequência e c) retorne LAST_INSERT_ID()
- Escreva uma classe Java que estenda
MySQLMaxValueIncrementere chama o procedimento armazenado nogetNextKey()método. Estou usando umSimpleJdbcCallinstância para fazer isso. - Escreva uma classe Java que implemente
DataFieldMaxValueIncrementerFactorye retorna uma instância da etapa 3 dogetIncrementer()método - Na configuração do lote, atualize o
org.springframework.batch.core.repository.support.JobRepositoryFactoryBeanconfiguração para usar a fábrica do incrementador da etapa 4