autocommit
Apprenez à utiliser mysqli_autocommit() en PHP pour gérer les transactions MySQLi avec commit et rollback.
Cet article présente la fonction mysqli_autocommit() en PHP, qui active ou désactive le mode autocommit de MySQLi. Vous apprendrez ce que fait l'autocommit, la syntaxe orientée objet et procédurale, ainsi que la façon de le combiner avec mysqli_commit() et mysqli_rollback() pour exécuter des transactions sûres de type « tout ou rien ».
Ce que signifie l'autocommit
Une transaction est un groupe d'instructions SQL qui doivent toutes réussir ou toutes échouer ensemble. Par défaut, MySQLi fonctionne en mode autocommit : chaque instruction constitue sa propre transaction et est sauvegardée (validée) dans la base de données dès son exécution. Il n'existe aucun moyen de l'annuler par la suite.
mysqli_autocommit() vous permet de désactiver ce comportement automatique. Une fois l'autocommit désactivé, vos instructions sont maintenues dans une transaction en attente jusqu'à ce que vous décidiez quoi en faire :
- Appelez
mysqli_commit()pour rendre tous les changements en attente permanents. - Appelez
mysqli_rollback()pour les annuler, laissant la base de données intacte.
C'est ce qui rend possible les mises à jour « tout ou rien » — par exemple, transférer de l'argent entre deux comptes où le débit et le crédit doivent tous deux réussir, ou aucun des deux ne doit avoir lieu.
Comment utiliser la fonction mysqli_autocommit()
L'utilisation de la fonction mysqli_autocommit() est très simple. Il suffit d'appeler la fonction en lui passant une connexion MySQLi valide et une valeur boolean représentant l'état de l'autocommit.
Paramètres :
connection(procédural) /$mysqli(POO) : L'objet de connexion MySQLi.mode(bool) :TRUEpour activer l'autocommit,FALSEpour le désactiver.
Valeur de retour : Retourne TRUE en cas de succès, FALSE en cas d'échec.
Remarque : MySQLi prend en charge la syntaxe orientée objet et procédurale. La méthode POO est $mysqli->autocommit($mode) ; l'équivalent procédural est mysqli_autocommit($mysqli, $mode). Les deux font exactement la même chose — choisissez le style déjà utilisé dans votre base de code. Consultez la présentation de PHP MySQLi pour en savoir plus sur les deux styles.
Voici un exemple de base utilisant le style orienté objet :
Comment utiliser la fonction 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();
?>Dans cet exemple, nous créons un nouvel objet MySQLi et désactivons l'autocommit en appelant la fonction autocommit() avec l'argument FALSE. Nous exécutons ensuite deux requêtes pour insérer et mettre à jour des données dans une table users. Nous validons la transaction en appelant la fonction commit() de l'objet MySQLi.
Nous réactivons ensuite l'autocommit en appelant la fonction autocommit() avec l'argument TRUE. Enfin, nous fermons la connexion MySQLi en utilisant la méthode close() de l'objet MySQLi.
Syntaxe procédurale
La même logique écrite en style procédural passe la connexion comme premier argument à chaque fonction :
<?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);
?>Annulation en cas d'erreur
La vraie valeur de la désactivation de l'autocommit est la possibilité d'annuler une transaction partiellement terminée en cas de problème. L'exemple ci-dessous encapsule deux mises à jour liées dans une transaction et effectue un rollback si l'une des requêtes échoue, de sorte que la base de données ne se retrouve jamais dans un état à moitié mis à jour :
<?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();
?>Étant donné que l'autocommit est désactivé, aucun UPDATE n'est sauvegardé tant que commit() n'est pas appelé. Si la deuxième requête échoue, rollback() annule également la première, garantissant que l'argent n'est jamais débité sans être crédité.
Utilisation avancée
La fonction mysqli_autocommit() opère au niveau de la connexion. Lorsque vous passez l'autocommit de FALSE à TRUE, MySQLi valide automatiquement toute transaction en attente. Ce comportement est utile lors de la gestion de plusieurs transactions indépendantes de manière séquentielle au sein du même script. Voici un exemple :
Utilisation avancée 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();
?>Dans cet exemple, nous désactivons l'autocommit et exécutons une requête INSERT. Nous validons ensuite explicitement la première transaction. Ensuite, nous désactivons à nouveau l'autocommit pour démarrer une deuxième transaction, exécutons une requête UPDATE et la validons. Enfin, nous réactivons l'autocommit et fermons la connexion MySQLi.
Conclusion
La fonction mysqli_autocommit() vous donne le contrôle sur le moment où MySQLi sauvegarde vos modifications. Désactivez-la avec FALSE pour démarrer une transaction, exécutez vos instructions, puis soit mysqli_commit() pour les rendre permanentes, soit mysqli_rollback() pour les annuler. Ce modèle est indispensable lorsque plusieurs instructions doivent réussir ou échouer ensemble. Réactivez toujours l'autocommit (ou fermez la connexion) lorsque vous avez terminé, afin que les requêtes ultérieures se comportent comme prévu et que vos données restent cohérentes.