bloqueio de tabelas para uso por um unico usuário não funciona - banco mysql e php
Bom dia pessoal!
Tenho uma aplicação que gera boletos num webservice do banco Santander. (uso php e banco MySql)
Eu que informo o numero do boleto ao banco.
tenho uma tabela (cobbole) onde guardo o ultimo numero de boleto gerado gerado.
Quando um usuário vai gerar um boleto, eu bloqueio as tabelas, pego o ultimo numero de boleto já gerado, somo 1 neste numero, insiro o registro na tabela de boletos, somo um no ultimo numero gerado e atualizo a tabela cobbole, para que o próximo usuário que vá gerar boletos já use o novo numero.
Acontece que, neste caminho, algo não funciona, pois em alguns momentos tenho obtido mensagem do banco que estou tentando imprimir um novo boleto com um numero já utilizado.
Acho que mais de uma pessoa está conseguindo fazer o procedimento ao mesmo tempo (ler qual o último numero de boleto usado) e ambas tentam gerar boletos com o mesmo número.
Ou seja, a minha ideia de bloquear as tabelas não está surtindo efeito.
Colocarei aqui a sequencia de comandos que estou usando para ver se vcs conseguem me ajudar a descobrir onde está o erro.
Muito obrigada!
//começo a transação
$conexao->beginTransaction();
//bloqueio as tabelas
$sql = "lock tables cobbole write , BoletoFichaFin write";
//nesta clausula localizo o último número de boleto utilizado (uso o comando for update):
$sql = "select * from cobbole where rcgempresa='" . $empresa . "' and convcob='" . $conveniobanco . "' for update";
//insiro na tabela BoletoFichaFin o novo boleto gerado somado um numero a mais
$sql = "insert into BoletoFichaFin ....novonumerodeboleto.."
//faço update da tabela cobbole atualizando o numero atual do boleto com o numero novo criado no passo anterior
$sql = "update cobbole set num_atual = " . $complemento . " where IDFicha = " . $idficha;
//finalizo a transação
$conexao->commit();
//desbloqueio as tabelas
$sql = "unlock tables";Discussão (1)
Carregando comentários...