[Cascavel-pm] Res: [Spam] Res: Res: Duvida $dbh->prepare

Patty Silva ptfzs em yahoo.com.br
Sexta Janeiro 26 08:11:29 PST 2007


Respondido minha duvida  anterior :-)

Obrigada pela eficiencia na resposta!!
:D

----- Mensagem original ----
De: André Garcia Carneiro <andre.garcia.carneir em terra.com.br>
Para: cascavel-pm <cascavel-pm em pm.org>
Enviadas: Sexta-feira, 26 de Janeiro de 2007 15:15:09
Assunto: Re: [Cascavel-pm] [Spam]  Res:  Res: Duvida  $dbh->prepare

 
> 
> Esta ai pessoal...... uma coisa que nunca coloco nos meus porgramas quando busco no BANCO eh o   
$sth2->commit;  ??? eh necessario??? pra q serve??
> 

Bom, em primeiro lugar vi que você trabalha com MySQL. MySQL recentemente começou a trabalhar com transações,
que é o motivo pelo qual você deve usar $sth->commit. Simplificando, uma transação permite que você "volte" o
estado de um banco de dados , ou confirme esse estado através de comandos SQL. Normalmente esses comandos se
resumem a 

BEGIN(indica que você quer iniciar uma transação)
COMMIT(indica que após uma série de comandos do tipo "INSERT, UPDATE, DELETE" etc você pode confirmar essas
operações que até então não estavam confirmadas)

ROLLBACK(indica que você pode voltar o estado do banco de dados, ou seja, "desfaz" todos os comandos que você
executou depois de BEGIN).

Claro que a sintaxe pode variar, por exemplo, no MySQL ao invés do BEGIN, você usa START_TRANSACTION.


Pois bem, após essa minúscula introdução, vamos para o que interessa. A classe DBI permite que você utilize
transações desde que o seu gerenciador de banco de dados permita isso. Para fazer isso você primeiro deve:

1 - Setar o AutoCommit como 0. Isso porque o default é 1, e isso significa(a grosso modo), que você não poderá
realizar 'rollback', pois o sistema já teria confirmado os seus comandos SQL. Para setar o AutoCommit, você
deve fazer como o Champs já explicou em e-mails anteriores, através do comando 'DBI->connect(<parâmetros de
conexão>,{AutoCommit=>0,RaiseError=>1});'   

2 - Colocar a execução da query dentro de um sistema de tratamento de erros. Tradicionalmente, em um bloco
eval... como você mesma já fez:
eval{
             $sth = $dbh->prepare_cached($SQL);
             $sth->execute;
}; #notação do perl. Sem esse ponto-vírgula você terá problemas.
if($@ || $DBI::errstr) #Se der chabú por algum motivo, então captura-se o erro
{
      $@ .= $DBI::errstr; # Só pra garantir que haverá uma mensagem de erro... Para quem quiser saber, tive
problemas com isso, e essa foi uma solução que funcionou.
     $dbh->rollback; # voltando ao estado anterior ao comando em $SQL.
     $result = $@;
}
else
{
      $dbh->commit; #Tudo ok... confirmando o comando e gravando as informações no banco de dados
      $result = 1;
}



3. Sempre, mas SEMPRE MESMO faça $dbh->disconnect. Se você precisar de outra conexão. Evitará problemas se
precisar de outra conexão, e usará mais racionalmente os recursos do servidor.
$sth->finish; # se não precisar mais utilizar a sua conexão, é uma boa idéia finalizar o statement handler.
$dbh->disconnect; 


#Fim


Espero que tenha ficado mais claro agora..




Cheers!







--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org

_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm






__________________________________________________
Fale com seus amigos  de graça com o novo Yahoo! Messenger 
http://br.messenger.yahoo.com/ 
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070126/83c5a718/attachment-0001.html 


Mais detalhes sobre a lista de discussão Cascavel-pm