autocommit
Aprende a usar mysqli_autocommit() en PHP para controlar las transacciones MySQLi con commit y rollback.
Este artículo cubre la función mysqli_autocommit() en PHP, que activa o desactiva el modo autocommit de MySQLi. Aprenderás qué hace autocommit, tanto la sintaxis orientada a objetos como la procedimental, y cómo combinarlo con mysqli_commit() y mysqli_rollback() para ejecutar transacciones seguras de todo o nada.
Qué significa autocommit
Una transacción es un grupo de sentencias SQL que deben tener éxito todas juntas o fallar todas juntas. Por defecto, MySQLi funciona en modo autocommit: cada sentencia individual es su propia transacción y se guarda (confirma) en la base de datos en el momento en que se ejecuta. No hay forma de deshacerla después.
mysqli_autocommit() permite desactivar ese comportamiento automático. Una vez deshabilitado el autocommit, las sentencias quedan en una transacción pendiente hasta que decides qué hacer con ellas:
- Llama a
mysqli_commit()para hacer permanentes todos los cambios pendientes. - Llama a
mysqli_rollback()para descartarlos, dejando la base de datos intacta.
Esto es lo que hace posibles las actualizaciones de "todo o nada"; por ejemplo, transferir dinero entre dos cuentas donde tanto el débito como el crédito deben completarse, o ninguno de los dos.
Cómo usar la función mysqli_autocommit()
Usar la función mysqli_autocommit() es muy sencillo. Solo necesitas llamar a la función y pasar una conexión MySQLi válida y un valor boolean que representa el estado del autocommit.
Parámetros:
connection(procedimental) /$mysqli(OOP): El objeto de conexión MySQLi.mode(bool):TRUEpara habilitar autocommit,FALSEpara deshabilitarlo.
Valor de retorno: Devuelve TRUE en caso de éxito, FALSE en caso de error.
Nota: MySQLi admite tanto la sintaxis orientada a objetos como la procedimental. El método OOP es $mysqli->autocommit($mode); el equivalente procedimental es mysqli_autocommit($mysqli, $mode). Ambos hacen exactamente lo mismo — elige el estilo que ya usa tu base de código. Consulta la introducción a PHP MySQLi para más información sobre los dos estilos.
A continuación se muestra un ejemplo básico usando el estilo orientado a objetos:
Cómo usar la función 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();
?>En este ejemplo, creamos un nuevo objeto MySQLi y deshabilitamos el autocommit llamando a la función autocommit() con el argumento FALSE. Luego ejecutamos dos consultas para insertar y actualizar datos en una tabla users. Confirmamos la transacción llamando a la función commit() del objeto MySQLi.
Después volvemos a habilitar el autocommit llamando a la función autocommit() con el argumento TRUE. Por último, cerramos la conexión MySQLi usando el método close() del objeto MySQLi.
Sintaxis procedimental
La misma lógica escrita en el estilo procedimental pasa la conexión como primer argumento a cada función:
<?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);
?>Revertir cambios en caso de error
El verdadero valor de deshabilitar el autocommit es la capacidad de deshacer una transacción parcialmente completada cuando algo sale mal. El ejemplo siguiente envuelve dos actualizaciones relacionadas en una transacción y realiza un rollback si alguna de las consultas falla, de modo que la base de datos nunca queda en un estado actualizado a medias:
<?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();
?>Dado que el autocommit está desactivado, ningún UPDATE se guarda hasta que se llama a commit(). Si la segunda consulta falla, rollback() descarta también la primera, garantizando que el dinero nunca se deduzca sin ser acreditado.
Uso avanzado
La función mysqli_autocommit() opera a nivel de conexión. Cuando cambias el autocommit de FALSE a TRUE, MySQLi confirma automáticamente cualquier transacción pendiente. Este comportamiento es útil cuando se gestionan múltiples transacciones independientes de forma secuencial dentro del mismo script. A continuación se muestra un ejemplo:
Uso avanzado de PHP autocommit()
<?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();
?>En este ejemplo, deshabilitamos el autocommit y ejecutamos una consulta INSERT. Luego confirmamos explícitamente la primera transacción. A continuación, deshabilitamos el autocommit de nuevo para iniciar una segunda transacción, ejecutamos una consulta UPDATE y la confirmamos. Finalmente, volvemos a habilitar el autocommit y cerramos la conexión MySQLi.
Conclusión
La función mysqli_autocommit() te da control sobre cuándo MySQLi guarda tus cambios. Desactívala con FALSE para iniciar una transacción, ejecuta tus sentencias y luego usa mysqli_commit() para hacerlas permanentes o mysqli_rollback() para descartarlas. Este patrón es esencial siempre que varias sentencias deban tener éxito o fallar como una unidad. Vuelve a habilitar el autocommit (o cierra la conexión) cuando hayas terminado, para que las consultas posteriores se comporten como se espera y los datos permanezcan consistentes.