Existem vários requisitos conflitantes expressos em sua pergunta. Esta resposta se concentra no aspecto de “manter o bloqueio”.
Para manter um bloqueio de tabela para toda a operação, você terá que manter uma única conexão com o servidor sql. Uma maneira seria passar tudo como uma entrada de vários comandos de várias linhas para uma única invocação do cliente de linha de comando mysql. Basicamente assim:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
Isso funcionaria desde que você possa gerar todas as instruções necessárias sem fazer perguntas do banco de dados (como identificador máximo) enquanto o bloqueio é mantido.
Para misturar operações de leitura (como solicitar um valor máximo) e operações de gravação (como carregar conteúdo de alguns arquivos), você precisará de uma comunicação bidirecional com o servidor. Conseguir isso através do bash é muito complicado, então eu desaconselho isso. Mesmo que você não precise fazer perguntas, a conexão unidirecional fornecida por um bash pipe é uma fonte de perigo:Se algo der errado no lado do mysql, o bash não perceberá e emitirá o próximo comando de qualquer maneira. Você pode acabar cometendo dados inconsistentes.
Por esses motivos, prefiro sugerir alguma linguagem de script para a qual as ligações mysql estejam disponíveis, como as opções Perl ou Pyhon que você mencionou. Ler arquivos CVS nesses idiomas é fácil, portanto, você pode fazer o seguinte em um único script:
- bloquear tabelas
- iniciar transação
- ler arquivos csv de entrada
- faça perguntas como id máximo
- ajuste os dados de entrada para corresponder ao layout da tabela
- inserir dados em tabelas
- se nenhum erro ocorreu, confirme a transação