Atomicité et isolation des transactions

Les transactions dans MySQL respectent les propriétés ACID, qui garantissent la fiabilité des transactions même en cas de panne ou d'échec. Les deux aspects fondamentaux des transactions dans ce contexte sont l'atomicité et l'isolation.

6.2.1 Atomicité

L'atomicité garantit que toutes les opérations d'une transaction soient exécutées ou qu'aucune ne le soit. Si une partie d'une transaction échoue, aucune des modifications effectuées avant l'erreur ne doit être appliquée à la base de données.

Exemple d'atomicité :

Supposons que nous transférons 500 € d'un compte à un autre. Si une des étapes échoue, la transaction doit être annulée.

START TRANSACTION;

UPDATE comptes SET solde = solde - 500 WHERE id_compte = 1;

-- Supposons que cette étape échoue
UPDATE comptes SET solde = solde + 500 WHERE id_compte = 2;

-- Si l'étape précédente échoue, annuler la transaction
ROLLBACK;

Dans cet exemple, l'atomicité garantit que l'argent ne sera retiré du premier compte que s'il est correctement ajouté au second.

6.2.2 Isolation

L'isolation assure que les modifications effectuées dans une transaction ne sont pas visibles par d'autres transactions tant que la transaction en cours n'est pas validée (COMMIT). Cela empêche les transactions simultanées d'accéder à des données partielles ou non validées.

Il existe plusieurs niveaux d'isolation dans MySQL :

  • READ UNCOMMITTED : Les transactions peuvent voir les modifications non validées d'autres transactions.

  • READ COMMITTED : Les transactions ne peuvent voir que les modifications validées.

  • REPEATABLE READ : Une transaction voit toujours les mêmes données, même si d'autres transactions les modifient entre-temps.

  • SERIALIZABLE : Le niveau le plus strict ; les transactions sont exécutées de manière séquentielle pour éviter toute interaction.

Exemple d'utilisation du niveau d'isolation :

Pour définir le niveau d'isolation d'une transaction, vous pouvez utiliser la commande suivante :

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

-- Requêtes ici

Comparaison des niveaux d'isolation :

  • READ UNCOMMITTED : Risque élevé de lire des données non validées (phénomène de lecture sale).

  • READ COMMITTED : Évite la lecture de données non validées, mais peut permettre la lecture de modifications effectuées par une autre transaction après le début de la transaction courante (lecture non répétable).

  • REPEATABLE READ : Évite les lectures non répétables, mais permet des anomalies comme le phantom read (insertion de nouvelles lignes visibles lors de la relecture).

  • SERIALIZABLE : Évite toutes les anomalies de lecture, mais peut ralentir les performances en bloquant les transactions concurrentes.

Last updated