Le niveau d'isolement des transactions définit les modifications de données d'autres transactions lors de l'exécution de la transaction. Différents niveaux d'isolement fournissent différents degrés d'isolement des données, et les niveaux d'isolement courants comprennent:
Lire non engagé
Permettre à une transaction de lire des données qui ne sont pas commises par une autre transaction peuvent provoquer une lecture sale.
Lire engagé
Une seule transaction est autorisée à lire les données engagées, en évitant les lectures sales, mais des lectures non répétibles peuvent se produire.
Lecture reproductible
Assurez-vous que toutes les requêtes dans une transaction renvoient les mêmes données, évitez la lecture non répatiable, mais la lecture fantôme peut encore se produire.
Sérialisable
Force les transactions exécutées en série, en évitant complètement la lecture sale, une lecture non répétée et une lecture fantôme, mais les performances seront grandement affectées.
L'OPD permet de définir les niveaux d'isolement des transactions avant le début des transactions. Cette opération est généralement effectuée par des instructions SQL. La méthode spécifique consiste à utiliser l'instruction SET Transaction Isolement Level pour définir le niveau d'isolement requis avant d'appeler PDO :: BeginTransaction (). Par exemple:
<span><span><span class="hljs-comment">// créer PDO Exemple</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-comment">// Définissez le niveau d'isolement des transactions sur“Reproductible”</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"</span></span><span>);
</span><span><span class="hljs-comment">// Démarrer une transaction</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// Effectuer des opérations de base de données</span></span><span>
</span><span><span class="hljs-comment">// ...</span></span><span>
</span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span></span>
Dans le code ci-dessus, définissez le niveau d'isolement de transaction, la lecture reproductible définit le niveau d'isolement des transactions à la lecture reproductible. Cela signifie que la requête exécutée dans la transaction actuelle renvoie toujours le même résultat, même si d'autres transactions modifient les données entre les deux.
Différents niveaux d'isolement des transactions ont des effets différents sur les problèmes de concurrence. Voici leurs manifestations spécifiques dans la prévention des problèmes de concurrence:
Lire non engagé
En vertu de ce niveau d'isolement, les transactions peuvent lire des données que d'autres transactions n'ont pas engagées, ce qui peut provoquer des lectures sales et ainsi provoquer des données incohérentes. Les problèmes de concurrence sont très susceptibles de se produire car il n'y a aucune restriction sur le fonctionnement d'autres transactions.
Lire engagé
Ce niveau d'isolement évite les problèmes de lecture sales, car les transactions ne peuvent lire que des données engagées. Cependant, il peut toujours être possible d'avoir des lectures non répétibles, c'est-à-dire lorsqu'une transaction lit deux fois les mêmes données, les données peuvent changer. Pour certains scénarios où la cohérence des données n'est pas élevée, ce niveau d'isolement peut équilibrer les performances et la cohérence.
Lecture reproductible
Le niveau d'isolement de lecture reproductible garantit que toutes les requêtes dans une transaction renvoient des données cohérentes, en évitant les lectures non répétibles. Cependant, une lecture fantôme peut se produire, c'est-à-dire qu'une autre transaction insère de nouvelles données entre la requête de transaction actuelle. Ce niveau d'isolement a un contrôle plus strict sur les opérations d'écriture simultanées, ce qui aide à améliorer la cohérence des données.
Sérialisable
Le niveau d'isolement de sérialisation est le plus strict, et il évite tous les problèmes de concurrence, notamment la lecture sale, la lecture non répétée et la lecture fantastique en forçant la sérialisation des transactions. Ce niveau d'isolement a un grand impact sur les performances et convient généralement aux scénarios où une cohérence stricte est nécessaire.
Le choix du niveau d'isolement des transactions approprié nécessite des compromis en fonction des besoins commerciaux spécifiques:
S'il s'agit d'un scénario d'application qui nécessite des performances élevées mais ne nécessite pas de cohérence des données élevée, vous pouvez choisir de lire le niveau d'isolement soumis . Cela évitera les lectures sales tout en permettant aux transactions simultanées de modifier les données.
Les lectures reproductibles sont un meilleur choix pour la plupart des applications car elles peuvent empêcher les lectures non répétibles et sales, et tout en garantissant la cohérence des données, la perte de performance est relativement faible.
Dans les systèmes qui doivent assurer une cohérence stricte des données et une faible concurrence, le niveau d'isolement sérialisé peut être sélectionné. Bien que ses performances soient médiocres, elle peut complètement éviter tous les problèmes de concurrence.
Supposons que nous développons un système bancaire qui doit s'assurer que le solde du compte de l'utilisateur ne provoque pas d'erreurs en raison des opérations simultanées. Nous pouvons empêcher la modification du solde interrogé dans une transaction par d'autres transactions en définissant un niveau d'isolement de lecture reproductible :
<span><span><span class="hljs-comment">// créer PDO Exemple</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=bank'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"</span></span><span>);
</span><span><span class="hljs-comment">// Démarrer une transaction</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// Vérifiez le solde du compte</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT balance FROM accounts WHERE account_id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>]);
</span><span><span class="hljs-variable">$balance</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchColumn</span></span><span>();
</span><span><span class="hljs-comment">// Exécuter une certaine logique commerciale</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$balance</span></span><span> > </span><span><span class="hljs-number">100</span></span><span>) {
</span><span><span class="hljs-comment">// Opération de déduction</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"UPDATE accounts SET balance = balance - 100 WHERE account_id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>]);
}
</span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span></span>
Dans cet exemple, un niveau d'isolement de lecture reproductible est défini pour garantir que le solde de la requête ne change pas en raison des modifications d'autres transactions, évitant ainsi les incohérences de données.
PDO :: BeginTransaction () est un outil puissant qui peut nous aider à gérer les transactions de base de données en PHP. En combinant avec des paramètres de niveau d'isolement des transactions raisonnables, nous pouvons prévenir efficacement les problèmes de concurrence et assurer la cohérence et l'intégrité des données. Au cours du processus de développement, nous devons choisir le niveau d'isolement des transactions approprié en fonction des besoins des entreprises pour équilibrer la relation entre les performances et la cohérence des données.
Étiquettes associées:
PDO