La documentation PHP met en évidence les avantages des transactions, en soulignant leur capacité à garantir des opérations atomiques, cohérentes, isolées et durables au sein d'une base de données .
Question :
Cela implique-t-il que des scripts PHP distincts exécutant des transactions simultanément peuvent fonctionner sans interférence ?
Élaboration sur les interférences :
Considérez la table des employés avec les données suivantes :
id | name | salary |
---|---|---|
1 | ana | 10000 |
Deux scripts avec un code similaire s'exécutent simultanément :
script1.php et script2.php :
<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;//increasing salary $stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?"); $stmt->execute(['ana']); $conn->commit();</code>
La question se pose concernant le salaire résultant d'«ana» selon différents scénarios d'exécution.
Réponse :
Le résultat dépend du niveau d'isolement configuré pour le moteur de table InnoDB dans MySQL. Quatre niveaux d'isolement existent selon le standard SQL :
Dans le scénario donné, l'utilisation du niveau d'isolement SERIALIZABLE et la désactivation de la validation automatique entraîneront un salaire de 12 000 car chaque transaction est isolée et exécutée séquentiellement.
Cependant, avec tout autre niveau d'isolation ou SERIALIZABLE avec la validation automatique activée , le résultat sera 11 000. En effet, les transactions peuvent se chevaucher dans ces cas, ce qui permet des interférences potentielles. L'utilisation de lectures verrouillées peut également affecter le résultat, conduisant potentiellement à un salaire de 12 000 sous tous les niveaux d'isolement.
Par conséquent, le niveau d'isolement spécifique et les paramètres de configuration utilisés détermineront l'interférence ou l'absence d'interférence entre les transactions simultanées dans les scripts PHP. .
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!