Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Migrando tabelas de sequência MyISAM do Spring Batch para o InnoDB


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.
  1. 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
  2. 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()
  3. Escreva uma classe Java que estenda MySQLMaxValueIncrementer e chama o procedimento armazenado no getNextKey() método. Estou usando um SimpleJdbcCall instância para fazer isso.
  4. Escreva uma classe Java que implemente DataFieldMaxValueIncrementerFactory e retorna uma instância da etapa 3 do getIncrementer() método
  5. 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