autocommit
Aprenda a usar mysqli_autocommit() em PHP para controlar transações MySQLi, combinando commit e rollback para operações seguras.
Este artigo aborda a função mysqli_autocommit() em PHP, que ativa ou desativa o modo autocommit do MySQLi. Você aprenderá o que o autocommit faz, tanto a sintaxe orientada a objetos quanto a procedural, e como combiná-lo com mysqli_commit() e mysqli_rollback() para executar transações seguras do tipo tudo-ou-nada.
O que significa autocommit
Uma transação é um grupo de instruções SQL que devem ter sucesso em conjunto ou falhar em conjunto. Por padrão, o MySQLi opera no modo autocommit: cada instrução é sua própria transação e é salva (confirmada) no banco de dados no momento em que é executada. Não há como desfazê-la depois.
mysqli_autocommit() permite desativar esse comportamento automático. Quando o autocommit está desativado, suas instruções ficam em uma transação pendente até que você decida o que fazer com elas:
- Chame
mysqli_commit()para tornar todas as alterações pendentes permanentes. - Chame
mysqli_rollback()para descartá-las, deixando o banco de dados intacto.
É isso que torna possíveis as atualizações "tudo-ou-nada" — por exemplo, transferir dinheiro entre duas contas onde tanto o débito quanto o crédito devem ter êxito, ou nenhum dos dois deve ocorrer.
Como usar a função mysqli_autocommit()
Usar a função mysqli_autocommit() é muito simples. Basta chamar a função e passar uma conexão MySQLi válida e um valor boolean que representa o estado do autocommit.
Parâmetros:
connection(procedural) /$mysqli(OOP): O objeto de conexão MySQLi.mode(bool):TRUEpara ativar o autocommit,FALSEpara desativá-lo.
Valor de retorno: Retorna TRUE em caso de sucesso, FALSE em caso de falha.
Nota: O MySQLi suporta tanto a sintaxe orientada a objetos quanto a procedural. O método OOP é $mysqli->autocommit($mode); o equivalente procedural é mysqli_autocommit($mysqli, $mode). Ambos fazem exatamente a mesma coisa — escolha o estilo que seu código já utiliza. Consulte a visão geral do PHP MySQLi para mais informações sobre os dois estilos.
Aqui está um exemplo básico usando o estilo orientado a objetos:
Como usar a função mysqli_autocommit()
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");
$mysqli->commit();
$mysqli->autocommit(TRUE);
$mysqli->close();
?>Neste exemplo, criamos um novo objeto MySQLi e desativamos o autocommit chamando a função autocommit() com o argumento FALSE. Em seguida, executamos duas consultas para inserir e atualizar dados em uma tabela users. Confirmamos a transação chamando a função commit() do objeto MySQLi.
Depois, reativamos o autocommit chamando a função autocommit() com o argumento TRUE. Por fim, fechamos a conexão MySQLi usando o método close() do objeto MySQLi.
Sintaxe procedural
A mesma lógica escrita no estilo procedural passa a conexão como primeiro argumento para cada função:
<?php
$link = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
// Turn off autocommit so the statements form one transaction
mysqli_autocommit($link, FALSE);
mysqli_query($link, "INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
mysqli_query($link, "UPDATE users SET name='John Doe' WHERE id=1");
mysqli_commit($link); // make both changes permanent
mysqli_autocommit($link, TRUE); // restore default behavior
mysqli_close($link);
?>Realizando rollback em caso de erro
O verdadeiro valor de desativar o autocommit é a capacidade de desfazer uma transação parcialmente concluída quando algo dá errado. O exemplo abaixo envolve duas atualizações relacionadas em uma transação e realiza rollback se qualquer uma das consultas falhar, para que o banco de dados nunca fique em um estado parcialmente atualizado:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$mysqli->autocommit(FALSE); // begin a transaction
$ok = $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$ok = $ok && $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
if ($ok) {
$mysqli->commit();
echo "Transfer completed.";
} else {
$mysqli->rollback(); // discard both updates
echo "Transfer failed and was rolled back.";
}
$mysqli->autocommit(TRUE);
$mysqli->close();
?>Como o autocommit está desativado, nenhum UPDATE é salvo até que commit() seja chamado. Se a segunda consulta falhar, rollback() descarta a primeira também, garantindo que o dinheiro nunca seja debitado sem ser creditado.
Uso avançado
A função mysqli_autocommit() opera no nível da conexão. Quando você alterna o autocommit de FALSE para TRUE, o MySQLi confirma automaticamente qualquer transação pendente. Esse comportamento é útil ao gerenciar múltiplas transações independentes de forma sequencial dentro do mesmo script. Veja um exemplo:
Uso avançado de autocommit() em PHP
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// Start and commit the first transaction
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->commit();
// Start and commit the second transaction
$mysqli->autocommit(FALSE);
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");
$mysqli->commit();
// Re-enable autocommit for subsequent queries
$mysqli->autocommit(TRUE);
$mysqli->close();
?>Neste exemplo, desativamos o autocommit e executamos uma consulta INSERT. Em seguida, confirmamos explicitamente a primeira transação. Depois, desativamos o autocommit novamente para iniciar uma segunda transação, executamos uma consulta UPDATE e a confirmamos. Por fim, reativamos o autocommit e fechamos a conexão MySQLi.
Conclusão
A função mysqli_autocommit() oferece controle sobre quando o MySQLi salva suas alterações. Desative-o com FALSE para iniciar uma transação, execute suas instruções e depois use mysqli_commit() para torná-las permanentes ou mysqli_rollback() para descartá-las. Esse padrão é essencial sempre que várias instruções devem ter êxito ou falhar como uma unidade. Sempre reative o autocommit (ou feche a conexão) quando terminar, para que as consultas posteriores se comportem conforme esperado e seus dados permaneçam consistentes.