[RESOLVIDO] Lock Table - MySQL

Bom dia pessoas,

Tenho alguns comandos SQL a serem executados em um sistema Java aqui, porém, a dúvida é quanto ao próprio SQL: tenho uma tabela de fornecedores no MySQL que precisa ser atualizada com dados vindos de um servidor com MS SQL Server (utilizado para outra aplicação que temos aqui), já que tenho a lista correta de fornecedores somente no MS SQL Server. Então, sempre que um usuário necessitar, ele atualiza os fornecedores do MySQL (bd principal que uso nesse sistema). Para isso, criei um método em Java que faz o seguinte:

1 - Remove uma FK relacionada ao fornecedor no MySQL.
2 - Apaga todos os fornecedores cadastrados no MySQL.
3 - Busca todos os fornecedores no MS SQL Server.
4 - Insere todos os fornecedores contidos no MS SQL Server no MySQL.

A dúvida é: como tenho dezenas de milhares de registros, a requisição ao método que faz todos os passos mencionados acima demora entre 20 a 30 segundos. Com isso, pode ocorrer de um usuário pedir essa atualização (com os 4 passos mencionados acima), e antes de terminar, outro tentar a mesma atualização. Então: há a possibilidade disso ocorrer (um usuário fazer a atualização e antes de terminar esta mesma atualização ser feita por outro usuário), ou o MySQL com o auto commit ligado garante que isso nunca vai acontecer (garantindo que cada chamada no MySQL seja feita uma após a outra)?
Pensei em usar o lock table quando eu for apagar os fornecedores do MySQL, mas neste artigo http://xoops.net.br/docs/mysql/manual/ch06s07.php é informado que o lock table não funciona quando há outra sessão aberta do MySQL.

Caso eu não tenha sido muito claro, é só perguntar.

Muito obrigado desde já, abraços.

Então deixa eu ver se entendi …

Sua aplicação tem um usuário “X” que acessa o BD mysql certo ?

O usuário que esta logado em sua aplicação , não é o mesmo usuário que acessa o BD , certo ?

Sua aplicação altera os registros ? e depois atualiza no BD origem , ou apenas faz a consulta dos dados ?

Tem alguns levantamentos e análise que são importante nesta etapa …

Boa tarde Aleksandro,

Primeiramente muito obrigado por estar ajudando.

Então, vou resumir o sistema como um todo e detalhar a parte do banco, acho que resumi muita coisa anteriormente.

O sistema web é alimentado por um banco de dados MySQL, o qual possui uma tabela de fornecedores. Porém, esses fornecedores já estão previamente cadastrados num banco MS SQL Server aqui da empresa, e preciso copiá-los (todos os registros) para o MySQL - sei que é uma prática horrível, mas por conta dos prazos, terá que ser assim por enquanto. Então temos uma página que faz uma requisição que:

1 - Apaga todos os fornecedores do MySQL.
2 - Copia os fornecedores cadastrados no MS SQL Server pro MySQL (isso se deve ao banco MS SQL Server que contem os fornecedores faz parte de outro sistema, onde é feito o cadastro deles)

A partir destas ações, criamos um método, chamado atualizarFornecedores(). Este nome de método é apenas um exemplo. Este método faz os passos 1 e 2 citados acima. Este método geralmente leva uns 30 segundos para ser executado do início ao seu fim.

Ou seja, apenas copio os fornecedores de uma banco para o outro - novamente explico que parece uma prática um tanto estranha, mas por conta do prazo terá que ser assim inicialmente.

Agora imagine dois usuários X e Y, que acessam o sistema web. X pede a atualização dos fornecedores através de um clique que chama o método atualizarFornecedores(). Como o método demora 30 segundos para ser executado, pode acontecer do usuário Y também clicar no botão do sistema web que chama o método atualizarFornecedores() nesse meio tempo (antes do mesmo método chamado pelo usuário X terminar de executar). Com isso, podem haver problemas, como corromper o banco ou mesmo travá-lo.

Com isso pensei: entre os passos 1 e 2 (apagar os fornecedores do MySQL e copiar os do MS SQL Server pro MySQL), uso o comando LOCK TABLE fornecedores, e com isso, forço o usuário Y a esperar o usuário X terminar de apagar e copiar os dados. Este comando lock tables realmente funcionaria com 100% de eficácia? Esta é a grande dúvida, quanto ao lock tables.

Espero ter sido mais claro, caso ainda tenha ficado vago ou confuso, é só dizer que tento esclarecer melhor.

Muito obrigado pela ajuda novamente, abraços.

Sinceramente não sei se LOCK TABLE do mysql funcione legal , pois até evito de usar estas coisas … no seu caso eu pensaria assim:

Se é uma função java que faz a chamada e acredito que isto seja por meio de uma ação do usuário , porque você não controla isto em uma Thread, desta forma você garante em sua aplicação e não pelo banco de dados que mesmo que estejam N + 1 usuários pendurados em sua aplicação , você controla a ação de cada um deles , ou seja, enquanto 1 estiver atualizando a aplicação, N aguarda e assim sucessivamente … faria desta forma …

Aleksandro,

Idéia muito boa! Vou fazer isso mesmo.

Muito obrigado pela ajuda, abraços!