Les transactions avec MySQL et PHP

Une transaction est une unité de travail logique qui contient une ou plusieurs instructions SQL. Les transactions sont des unités de travail atomiques pouvant être validées ou annulées. Lorsqu’une transaction apporte plusieurs modifications à la base de données, toutes les modifications aboutissent lorsque la transaction est validée ou toutes les modifications sont annulées lorsque la transaction est annulée.
 


 

Exemple concret

Si vous effectuez une transaction de transfert d’argent d’une banque à une autre, à ce moment-là, si une interruption est due à Internet/Serveur ou à un autre problème, la transaction reviendra alors à son stade initial et votre argent sera remboursé à votre compte.

Dans ce tutoriel, nous allons utiliser les tables « Personnes » et « Commandes » mentionnées ci-dessous.

mysql> SELECT * FROM personnes;
+------------+------------------+----------+
|    P_ID    |        NOM       |    AGE   |
+------------+------------------+----------+
|          1 | Alex Babtise     |       22 |
|          2 | Eric Maxich      |       30 |
|          3 | Yohan Suinol     |       18 |
+------------+------------------+----------+
3 rows in set (0.00 sec)

 

mysql> SELECT * FROM commandes;
+------------+--------------+----------+
|    C_ID    |   NUM_CMD    |   P_ID   |
+------------+--------------+----------+
|          1 | 001259       |       2  |
|          2 | 005896       |       1  |
|          3 | 009671       |       3  |
+------------+--------------+----------+
3 rows in set (0.00 sec)

Pensez que vous devez ajouter « Thomas Suzik » en tant que nouvelle personne avec sa commande. Vous exécuteriez les deux instructions INSERT suivantes.

INSERT INTO `personnes` (`p_id`, `nom`, `age`) VALUES (4, 'Thomas Suzik', 50);
INSERT INTO `commandes` (`c_id`, `num_cmd`, `p_id`) VALUES (8, '009741', 4);

Vous pouvez voir que dans la deuxième instruction, 4 est donné pour `P_ID`, qui est la valeur de `P_ID` dans la première requête. Lorsque vous exécutez ces deux instructions, supposez que la première échoue et que la deuxième réussit.

Ensuite, la table `commandes` aura une ligne qui fait référence à une personne dont l’ID est 4 et qui n’existe pas. Si nous avons exécuté ces deux instructions dans une transaction MySQL, si la première instruction échoue, la seconde instruction sera annulée, sans modification.
 
 
En PHP, nous pouvons exécuter une transaction en utilisant les fonctions MySQLi comme ci-dessous.

<?php

$p_id = 4;

//se connecter à la base de données mysql
$conn = mysqli_connect('localhost', 'root', ' ', 'test_db');

mysqli_autocommit($conn, false);

$state = true;

$req1 = "INSERT INTO `personnes` (`p_id`, `nom`, `age`) VALUES ($p_id, 'Thomas Suzik', 50)";
$req2 = "INSERT INTO `commandes` (`c_id`, `num_cmd`, `p_id`) VALUES (8, '009741', $p_id)";

$res = mysqli_query($conn, $req1);

if (!$res) {
    $state = false;
    echo "Error: " . mysqli_error($conn) . ".";
}

$res = mysqli_query($conn, $req2);

if (!$res) {
    $state = false;
    echo "Error: " . mysqli_error($conn) . ".";
}

if ($state) {
    mysqli_commit($conn);
    echo "Toutes les requêtes ont été exécutées avec succès";
} else {
    mysqli_rollback($conn);
    echo "Toutes les requêtes ont été annulées";
} 

mysqli_close($conn);

?>

Lorsque vous exécutez la fonction mysqli_query(), le résultat est immédiatement validé dans la base de données. En utilisant la fonction mysqli_autocommit(), vous pouvez désactiver ce comportement afin que le résultat ne soit pas validé de manière permanente dans la base de données tant que vous ne l’ayez pas validé.

À la fin, si la variable « state » est true ( c’est a dire que, aucune erreur ne s’est produite), nous validons les résultats dans la base de données de manière permanente à l’aide de mysqli_commit(). Sinon, nous annulons les résultats en utilisant la fonction mysqli_rollback().
QCM sur PHP

Une réflexion sur “Les transactions avec MySQL et PHP

  • octobre 20, 2023 à 10:49 am
    Permalien

    nous avons aime votre site mais il faut nous donner les transactions de plusieurs tables(donc plus de dux tables).

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *