|
Tutoriais » PHP » Tratando uma transação » Já vimos que a PHP tem um monte de funções e característica de linguagem que a fazem ser uma 'linguagem computacional'. Também já vimos como ele lida com outros serviços (o servidor de página e o SGBD). Depois que o SGBD recebe este aviso: Ô, começa uma transação! Ele passa a gravar as tentativas de atualização no banco em um arquivo de trabalho, e vai pedindo ao SO que segure os espaços do HD onde estão oa dados que ele vai atualizar. Quando o SO consegue bloquear todas páginas de dados e o SGBD consegue chegar no final da sequencia de comandos da transação o Programa Aplicativo deve informar o FIM_DA_TRANSAÇÃO. Neste momento o SGBD tem a certeza de ter todas as páginas bloqueadas e os comandos gravados em seu arquivo de trabalho, daí ele pode começar a realmente atualizar o Banco de Dados. Péraí: E se (ô chatice o tal 'e se')... Mas, e se, dentro da transação acontece algum erro de funcionamento no sistema? Ah! A transação deve ser ABANDONADA. Dá uma olhada no fluxo que podemos montar para controlar a transação. Epa! Tem um furo no fluxo. Se ao tentar o bloqueio na página de dados o SGBD não conseguir é um erro mas a transação não pode ser abandonada... ela deve ser re-tentada. Então de algum modo o SGBD deve avisar que um comando recebeu um código de erro que informa erro sim, mas deve ser tratado de modo diferente no fluxo de controle. Eita! Agora a gente vai ter que ver os códigos de erros que o SGBD retorna para a aplicação? SIM! Não tem para onde fugir. O MySQL, o PostgreSQL e os outros... TODOS têm uma tabela de código e mensagem de erro. E no caso da situação de erro ser porque o SO não deixou o bloqueio ser feito é particularmente denominado como DEADLOCK. Tá bom!!! Se você estudar mais sobre o assunto vai ter que procurar mais e ler muito. Bem, então se o erro for por DEADLOCK a transação deve ser re-tentada e se for outra situação de erro: ABANDONADA e se não tiver erro: CONCLUÍDA Vamos aos programas? Iniciando uma transação: START TRANSACTION (MySQL) - ou - BEGIN (PostgreSQL) Concluindo a transação: COMMIT Abandonando a transação: ROLLBACK Podemos escrever um novo fluxo para tratamento de transação. Agora vamos para PHP... Lembra do seu comando INSERT que recebeu o tratamento de erro? Então podemos agora incluir o tratamento de transação. O programa está considerando somente o lado de atualização no banco de dados. Agora acabou! © João Maurício Hypólito - Ourinhos/SP |