English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Transaction MySQL

MySQL transactions sont principalement utilisées pour traiter des données de grande quantité et de haute complexité. Par exemple, dans un système de gestion des ressources humaines, si vous supprimez un employé, vous devez non seulement supprimer les informations de base de l'employé, mais aussi supprimer les informations associées à cet employé, telles que les boîtes aux lettres, les articles, etc., de sorte que ces instructions d'opération de base de données constituent une transaction !

  • Dans MySQL, seules les bases de données ou les tables utilisant le moteur de base de données Innodb prennent en charge les transactions.

  • Le traitement des transactions peut être utilisé pour maintenir l'intégrité des bases de données, garantissant que les ensembles d'instructions SQL sont soit tous exécutés, soit tous non exécutés.

  • Les transactions sont utilisées pour gérer les instructions insert, update, delete

En règle générale, une transaction doit remplir les4une condition (ACID) : : atomicité (Atomicity, ou appelée indivisibilité), cohérence (Cnsistence), isolation (Isolation, également connue sous le nom d'indépendance), pérennité (Durabilité).

  • Atomicité :Toutes les opérations d'une transaction (transaction) doivent être soit complètes, soit non réalisées du tout, sans s'achever à un certain niveau intermédiaire. Si une erreur se produit pendant l'exécution d'une transaction, elle sera annulée (Rollback) à l'état avant le début de la transaction, comme si cette transaction n'avait jamais été exécutée.

  • Consistance :Avant et après le début de la transaction, l'intégrité de la base de données n'est pas violée. Cela signifie que les informations écrites doivent être complètement conformes à toutes les règles prédéfinies, ce qui inclut l'exactitude, la cohérence et la capacité de la base de données à achever des tâches prévues spontanément.

  • Isolement :La capacité de la base de données à permettre plusieurs transactions concurrentes de lire et modifier ses données en même temps, l'isolement peut empêcher les incohérences causées par l'exécution croisée des transactions concurrentes. L'isolement des transactions est divisé en différents niveaux, y compris READ UNCOMMITTED (lire non soumis), READ COMMITTED (lire soumis), REPEATABLE READ (lecture répétée) et SERIALizable (serializable).

  • Persistance :Après la fin du traitement des transactions, les modifications apportées aux données deviennent permanentes, même si le système est en panne, elles ne seront pas perdues.

Sous la configuration par défaut de la ligne de commande MySQL, les transactions sont automatiquement soumises, c'est-à-dire qu'après l'exécution d'une instruction SQL, une opération COMMIT est immédiatement exécutée. Par conséquent, pour ouvrir explicitement une transaction, il est nécessaire d'utiliser la commande BEGIN ou START TRANSACTION, ou d'exécuter la commande SET AUTOCOMMIT=0 pour interdire l'utilisation de l'auto-s soumission de la session actuelle.

Instructions de contrôle des transactions :

  • BEGIN ou START TRANSACTION ouvre explicitement une transaction ;

  • COMMIT peut également être utilisé sous la forme COMMIT WORK, bien que les deux soient équivalents. COMMIT soumet la transaction et rend permanentes toutes les modifications apportées à la base de données ;

  • ROLLBACK peut également être utilisé sous la forme ROLLBACK WORK, bien que les deux soient équivalents. Le rollback termine la transaction de l'utilisateur et annule toutes les modifications non soumises en cours ;

  • SAVEPOINT identifier, SAVEPOINT permet de créer un point de sauvegarde dans une transaction, une transaction peut avoir plusieurs SAVEPOINT ;

  • RELEASE SAVEPOINT identifier supprime un point de sauvegarde de la transaction, lorsqu'il n'y a pas de point de sauvegarde spécifié, l'exécution de cette instruction provoque une exception ;

  • ROLLBACK TO identifier fait revenir la transaction à un point de repère ;

  • SET TRANSACTION est utilisé pour définir le niveau d'isolement des transactions. Le moteur de stockage InnoDB fournit des niveaux d'isolement de transaction tels que READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ et SERIALIZABLE.

La gestion des transactions de MYSQL se fait principalement de deux manières :

1Utiliser BEGIN, ROLLBACK, COMMIT pour réaliser

  • BEGIN Commencer une transaction

  • ROLLBACK Retour en arrière de transaction

  • COMMIT  Confirmation de transaction

2、modifier directement le mode d'auto-soumission de MySQL avec SET :

  • SET AUTOCOMMIT=0   Désactiver l'auto-soumission

  • SET AUTOCOMMIT=1 Activer l'auto-soumission

mysql> use w3codebox;
Database changed
mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb;      # Création de la table de données
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from w3codebox_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;      # Début de la transaction
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into w3codebox_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into w3codebox_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
 
mysql> commit;      # Soumission de la transaction
Query OK, 0 rows affected (0.01 sec)
 
mysql> select * from w3codebox_transaction_test;
+------+
| id          |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql> begin;      # Début de la transaction
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into w3codebox_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
 
mysql> rollback;      # Rollback
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from w3codebox_transaction_test;      # Aucune insertion de données car rollback
+------+
| id          |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql>

Exemple d'utilisation de la transaction en PHP

<?php
$dbhost = 'localhost';  // Adresse de l'hôte du serveur MySQL
$dbuser = 'root';            // Nom d'utilisateur MySQL
$dbpass = '123456';          // Nom d'utilisateur et mot de passe MySQL
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('Échec de la connexion: ' . mysqli_error($conn));
}
// Définir l'encodage, pour éviter les caractères chinois malformés
mysqli_query($conn, "set names utf8);
mysqli_select_db( $conn, 'w3codebox' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // Définir pour ne pas soumettre automatiquement, car MYSQL exécute immédiatement par défaut
mysqli_begin_transaction($conn);            // Début de la définition de la transaction
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values (8)")
{
    mysqli_query($conn, "ROLLBACK");     // Retour en arrière si l'exécution échoue
}
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values (9)")
{
    mysqli_query($conn, "ROLLBACK");      // Retour en arrière si l'exécution échoue
}
mysqli_commit($conn);            //Exécuter la transaction
mysqli_close($conn);
?>