Maison  >  Article  >  base de données  >  Les transactions MySQL avec PDO peuvent-elles s'exécuter simultanément sans interférence ?

Les transactions MySQL avec PDO peuvent-elles s'exécuter simultanément sans interférence ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 04:16:02829parcourir

 Can MySQL Transactions with PDO Run Concurrently Without Interference?

Explorer la concurrence des transactions MySQL avec PDO

Le sujet des transactions de base de données est souvent accompagné de l'acronyme ACID, représentant l'atomicité, la cohérence, l'isolement et la durabilité. En termes plus simples, les transactions garantissent que les opérations de base de données sont effectuées de manière fiable et ne sont pas affectées par d'autres connexions simultanées.

Cependant, une question se pose : plusieurs scripts PHP peuvent-ils exécuter des transactions simultanément sans interférence ? Pour comprendre cela, considérons le scénario suivant :

Supposons une table nommée « employés » avec deux champs : « id » et « salaire ». Deux scripts, script1.php et script2.php, exécutent simultanément le code suivant :

<code class="php">$conn->beginTransaction();

$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$salary = $row['salary'];
$salary = $salary + 1000;

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit();</code>

Quel serait le salaire obtenu pour "ana" dans ce scénario ?

La réponse dépend de le niveau d'isolement configuré pour le moteur de table MySQL InnoDB. InnoDB prend en charge quatre niveaux d'isolement, comme spécifié par la norme SQL :

  • Lecture non validée
  • Lecture validée
  • Lecture répétable
  • Sérialisable

Par défaut, MySQL utilise le niveau d'isolement "Read Comended". Dans ce niveau, le résultat serait 11000. En effet, script1.php et script2.php lisent les mêmes données avant que l'un ou l'autre ne s'engage.

Si le niveau d'isolement « sérialisable » est utilisé, le résultat serait 12000. En effet, Serialisable garantit que les transactions sont exécutées séquentiellement et empêche d'autres transactions d'interférer avec les données verrouillées.

Dans l'exemple donné, la séquence d'événements est :

  1. script1.php sélectionne data
  2. script2.php sélectionne les données
  3. script1.php met à jour les données
  4. script2.php met à jour les données
  5. script1.php valide
  6. script2.php commits

Avec l'isolation "Read Comended", les deux scripts lisent les mêmes données avant que l'un d'entre eux ne soit validé. Par conséquent, l'augmentation de salaire n'est pas isolée et est appliquée deux fois, ce qui entraîne une augmentation de 2000.

Avec l'isolation "Sérialisable", la première transaction (script1.php) verrouille la ligne pour "ana" lorsqu'elle sélectionne les données. Lorsque script2.php essaie de sélectionner les mêmes données, il attendra la validation de la première transaction. Cela garantit que les données ne sont pas modifiées par une autre transaction lors de leur lecture, et que l'augmentation de salaire n'est appliquée qu'une seule fois, ce qui entraîne une augmentation de 1000.

Par conséquent, l'interférence entre les transactions simultanées dépend de la niveau d’isolement et la séquence spécifique des opérations. Comprendre les implications des différents niveaux d'isolement est crucial pour garantir que les transactions se comportent comme prévu dans des environnements simultanés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn