Implementação de métodos commit () e rollback () com mysqli e PHP 5

Caros leitores, há muito tempo não escrevo aqui no Profissionais TI e também há muito tempo venho tentando encontrar um assunto interessante para voltar a escrever. Bom, eis que a necessidade de utilizar os métodos commit() e rollback() me trouxe esse tema como idéia de novo post por aqui.

Pesquisando no nosso grande amigo (e senhor de toda a sabedoria) Google, encontrei uma série de posts sobre o assunto que ajuda a entender como esses métodos funcionam e como implementá-los em nossos sistemas. Os posts originais estão em inglês, portanto, o que vou disponibilizar por aqui é uma tradução e no final do post está o link para o artigo original. Boa leitura!

Para usar os métodos “commit ()” e “autocommit ()”, você deve definir as suas tabelas de banco de dados como sendo do tipo “InnoDB”. Outros tipos, como “MyISAM” ou “ISAM” não suportam essas características. Mantenha essa limitação em mente antes de implementar os métodos que eu mencionei antes.

Tendo esclarecido a questão anterior, deixe-me descrever brevemente o significado das declarações COMMIT e ROLLBACK. Em suma, a instrução COMMIT significa que as alterações feitas durante uma transação de um banco de dados particular (ou um conjunto de bases de dados) são permanentes e se tornam visíveis a outros usuários. Por outro lado, como você já deve ter adivinhado, uma instrução ROLLBACK lhe permitirá cancelar as modificações feitas durante a transação atual. Muito simples, certo?

Uma vez que as características acima mencionadas estão disponíveis apenas em bases “InnoDB”, aqui está um exemplo que mostra como usar os métodos “commit ()” e “autocommit ()”, assumindo que esteja sendo usado o tipo correto de tabela:

/ / Exemplo commit-autocommit que usa uma tabela InnoDB
$mysqli=new mysqli('host','user','password','database');
if(mysqli_connect_errno()){
trigger_error('Error connecting to host. '.$mysqli-
>error,E_USER_ERROR);
}
// turn off AUTOCOMMIT, then run some queries
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO customers (id,name,email) VALUES
(NULL,'customer1','[email protected]')");
$mysqli->query("INSERT INTO customers (id,name,email) VALUES
(NULL,'customer2','[email protected]')");
// commit transaction
$mysqli->commit();
// close connection
$mysqli->close();

Neste caso, usei três métodos diferentes que vêm com a extensão “mysqli”, depois de realizar a conexão correspondente ao servidor MySQL e selecionando o banco de dados apropriado. O primeiro, “autocommit ()”, desativa o recurso AUTOCOMMIT do MySQL, o que significa que a transação corrente será aberta para o usuário selecionado. Então, o script insere dois novos clientes na tabela “clientes” através do método “query()” e, finalmente, confirmo a transação, obviamente usando o método “commit ()”.

Como você pode ver, usar o AUTOCOMMIT e COMMIT, recursos disponíveis em tabelas “InnoDB”, é um processo bastante compreensível que pode ser executado usando alguns métodos simples. Agora, vamos seguir em frente e ver como o recurso “ROLLBACK” pode ser implementado com a extensão “mysqli”. Isto é o tema do próximo post.

Autor: Alejandro Gervasio
Post original em: http://www.devshed.com
Traduzido e adaptado por: Sérgio Novelli usando Google Tranlator

Sérgio Novelli

Mais artigos deste autor »

É Especialista em Análise e Desenvolvimento de Sistemas pelo ISFACES e Bacharel em Sistemas de Informação pela Unipar.

Com ampla experiência em TI, hoje é ScrumMaster da equipe de desenvolvimento de sistemas web/mobile na Alkantára. Como ferramentas de desenvolvimento utiliza PHP, MySQL, PostgresSQL, Twitter BootStrap, JQuery e Ajax. É estudante assíduo dos métodos ágeis Kanban e SCRUM e suas aplicações.


4 Comentários

olavo
2

por default então autocommit() esta true? A ideia de passar false é para controlar o commit e emalgum momento usar o rollback?

Sérgio Novelli
3

Obrigado, Léo (Marketing Digital). Sempre que possível vou deixar algo novo nesse sentido por aqui. 😉
Olavo, é isso mesmo!! Por padrão o mysql trás consfigurado o autocommit() como true. Por isso geralmente não se faz o controle de transações. Mas esse é um recurso muito importante para garantir a integridade de um banco de dados em um sistema com muitas transações e multiusuário.
Num próximo post explicarei como utilizar o rollback(). Obrigado pelo comentário.

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!