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
MySQLMaxValueIncrementer
e chama o procedimento armazenado nogetNextKey()
método. Estou usando umSimpleJdbcCall
instância para fazer isso. - Escreva uma classe Java que implemente
DataFieldMaxValueIncrementerFactory
e retorna uma instância da etapa 3 dogetIncrementer()
método - Na configuração do lote, atualize o
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
configuração para usar a fábrica do incrementador da etapa 4