Dans PHP, l'extension MySQLI est l'un des outils les plus couramment utilisés pour interagir avec une base de données lors de l'utilisation d'une base de données MySQL. Lorsque nous avons besoin de transactions qui nécessitent des opérations de base de données, la méthode MySQLI :: Begin_transaction fournit un mécanisme pour contrôler le début d'une transaction. Cependant, en plus de simplement ouvrir des transactions, le niveau d'isolement d'une transaction est également une considération très importante car elle affecte directement le comportement de lecture et de verrouillage des données.
Cet article explorera comment définir et ajuster le niveau d'isolement des transactions dans MySqli :: Begin_transaction , et expliquer le rôle et les scénarios applicables de différents niveaux d'isolement.
Le niveau d'isolement des transactions définit la visibilité des opérations dans une transaction à d'autres transactions. Différents niveaux d'isolement déterminent comment les données interagissent avec d'autres transactions simultanées lors de l'exécution d'une transaction. Il y a principalement quatre niveaux d'isolement des transactions:
Lire non engagé : Le niveau d'isolement le plus bas permet aux transactions de lire les données d'autres transactions non engagées. Cela peut entraîner des lectures sales, des lectures non répétibles et des lectures fantômes.
Lire engagé (Lire engagée) : les transactions ne peuvent lire que des données engagées. Bien que la lecture sale soit évitée, vous pouvez toujours rencontrer des lectures non répétibles et une lecture fantôme.
Readable Read : Lors de l'exécution de la transaction, toutes les données de ligne de lecture seront verrouillées et d'autres transactions ne peuvent pas modifier ces lignes. La lecture sale et la lecture non réparable sont évitées, mais la lecture fantôme peut encore se produire.
Sérialisable (sérialisable) : le niveau d'isolement le plus élevé, toutes les transactions seront complètement isolées, et il n'y aura pas de lecture sale, de lecture non répétée et de lecture fantôme. Faibles performances, mais garantit la cohérence et l'intégrité des données.
Dans MySQLI , nous pouvons définir le niveau d'isolement de la transaction via la méthode MySQLI :: set_charset . Habituellement, cela doit être défini à l'aide de l'instruction SQL de niveau d'isolement de transaction définie avant d'appeler Begin_Transaction .
Voici les étapes pour définir et ajuster le niveau d'isolement des transactions:
Tout d'abord, créez une connexion à la base de données MySQL:
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span></span>
Avant d'appeler begin_transaction , les instructions SQL peuvent être utilisées pour spécifier le niveau d'isolement de la transaction. Par exemple, pour définir le niveau d'isolement de lecture reproductible :
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"</span></span><span>);
</span></span>
Vous pouvez choisir le niveau d'isolement approprié au besoin.
Après avoir réglé le niveau d'isolement de la transaction, démarrez la transaction à l'aide de début_transaction :
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>
Effectuez une série d'opérations de base de données dans une transaction:
<span><span><span class="hljs-keyword">try</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-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2')"</span></span><span>);
</span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// Si quelque chose ne va pas,Transactions en arrière</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
}
</span></span>
Selon l'exécution de la transaction, vous pouvez choisir de commettre ou de faire reculer la transaction:
Utilisez $ mysqli-> commit () pour commettre la transaction.
Utilisez $ mysqli-> rollback () pour faire reculer la transaction.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Créer une connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// Définir le niveau d'isolement des transactions</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"</span></span><span>);
</span><span><span class="hljs-comment">// Démarrer une transaction</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// Effectuer certaines opérations de base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO products (name, price) VALUES ('product1', 100)"</span></span><span>);
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE products SET price = 150 WHERE name = 'product2'"</span></span><span>);
</span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Soumission de transaction réussie!"</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// Transactions en arrière</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Rollback des transactions: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-comment">// Fermez la connexion de la base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Le choix du niveau d'isolement approprié dépend souvent des exigences de l'entreprise et de la concurrence du système. Voici quelques suggestions pour les scénarios courants:
Fonctionnement de la requête de concurrence élevée : sélectionnez Lire engagé ou reproductible lire pour équilibrer les performances et la cohérence des données.
La cohérence des données doit être strictement garantie : choisissez la sérialisable , ce qui garantira que les transactions sont complètement isolées, mais les performances seront grandement affectées.
Applications ayant des exigences de performance élevées : dans le cas des exigences de performance élevées, vous pouvez choisir la lecture non engagée , mais faites attention au problème de lecture.
Lorsque vous utilisez une extension MySQLI dans PHP, la définition du niveau d'isolement d'une transaction est une opération très importante. En utilisant l'instruction SET Transaction Isolement Level , nous sommes en mesure d'ajuster le niveau d'isolement avant MySQLI :: Begin_transaction pour assurer la fiabilité et la cohérence de l'exécution des transactions. Le choix du niveau d'isolement approprié a un impact important sur les performances de la base de données et la cohérence des données, donc pendant le processus de développement, le niveau d'isolement des transactions approprié doit être soigneusement sélectionné selon les besoins de l'entreprise.
Étiquettes associées:
mysqli