In PHP ist die MySQLI -Erweiterung eines der am häufigsten verwendeten Tools, um mit einer Datenbank zu interagieren, wenn eine MySQL -Datenbank verwendet wird. Wenn wir Transaktionen benötigen, die Datenbankvorgänge erfordern, bietet die MySQLI :: Beginn_transaction -Methode einen Mechanismus zur Steuerung des Beginns einer Transaktion. Zusätzlich zum einfachen Öffnen von Transaktionen ist das Isolationsniveau einer Transaktion auch eine sehr wichtige Überlegung, da sie direkt das Lese- und Verriegelungsverhalten von Daten beeinflusst.
In diesem Artikel wird untersucht, wie das Isolationsniveau der Transaktionen in MySQLI :: begin_transaktion festgelegt und anpassen und die Rolle und die anwendbaren Szenarien verschiedener Isolationsstufen erläutert.
Die Transaktions -Isolationsstufe definiert die Sichtbarkeit von Operationen in einer Transaktion zu anderen Transaktionen. Unterschiedliche Isolationsstufen bestimmen, wie Daten bei Ausführung einer Transaktion mit anderen gleichzeitigen Transaktionen interagieren. Es gibt hauptsächlich vier Transaktions -Isolationswerte:
Lesen Sie Uncombit : Mit der niedrigsten Isolationsstufe können Transaktionen Daten aus anderen nicht verbindlichen Transaktionen lesen. Dies kann zu schmutzigen Lesevorgängen, nicht wiederholbaren Lesevorgängen und Phantom-Lesevorgängen führen.
Lesen Sie engagiert (gelesen engagiert) : Transaktionen können nur festgelegte Daten lesen. Obwohl das schmutzige Lesen vermieden wird, können Sie immer noch nicht wiederholbares Lesen und Phantom-Lesen begegnen.
Wiederholbares Lesen : Während der Ausführung der Transaktion werden alle Lesezeilendaten gesperrt und andere Transaktionen können diese Zeilen nicht ändern. Schmutziges Lesen und nicht wiederholbares Lesen werden vermieden, aber es kann immer noch Phantom-Lesen auftreten.
Serialisierbar (serialisierbar) : Die höchste Isolationsniveau sind alle Transaktionen vollständig isoliert, und es wird kein schmutziges Lesen, nicht wiederholbare Lektüre und Phantom-Lesen geben. Niedrige Leistung, sorgt jedoch für die Konsistenz und Integrität von Daten.
In MySQLI können wir die Isolationsstufe der Transaktion durch die MySQLI :: Set_Charset -Methode festlegen. Normalerweise muss dies unter Verwendung der SQL -Anweisung der Transaktions -Isolationsstufe festgelegt werden, bevor er begann_transaktion aufruft.
Hier sind die Schritte zum Einstellen und Anpassen der Transaktions -Isolationsstufe:
Erstellen Sie zunächst eine Verbindung zur MySQL -Datenbank:
<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">"Verbindung ist fehlgeschlagen: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span></span>
Vor dem Aufrufen von beginn_transaktion können SQL -Anweisungen verwendet werden, um die Isolationsstufe der Transaktion anzugeben. Zum Beispiel, um die wiederholbare Lese -Isolationsstufe einzustellen:
<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>
Sie können nach Bedarf die entsprechende Isolationsstufe auswählen.
Starten Sie nach Einstellung der Isolationsstufe der Transaktion die Transaktion mit Beginn_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>
Führen Sie eine Reihe von Datenbankoperationen in einer Transaktion aus:
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// Datenbankvorgänge durchführen</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">// Transaktionen einreichen</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">// Wenn etwas schief geht,Rollen Sie Transaktionen zurück</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>
Abhängig von der Transaktionsausführung können Sie die Transaktion festlegen oder zurückführen:
Verwenden Sie $ mysqli-> commit (), um die Transaktion zu begehen.
Verwenden Sie $ MySQLI-> Rollback (), um die Transaktion zurückzurollen.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Erstellen Sie eine Datenbankverbindung</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">"Verbindung ist fehlgeschlagen: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// Setzen Sie die Transaktions -Isolationsstufe</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">// Starten Sie eine Transaktion</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">// Führen Sie einige Datenbankvorgänge aus</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">// Transaktionen einreichen</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">"Transaktionseinreichung erfolgreich!"</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">// Rollen Sie Transaktionen zurück</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">"Transaktionsrollback: "</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">// Schließen Sie die Datenbankverbindung</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>
Die Auswahl des geeigneten Isolationsniveaus hängt häufig von den Geschäftsanforderungen und dem Systemverkehr ab. Hier sind einige Vorschläge für gemeinsame Szenarien:
Hoher Anfragebetrieb mit hoher Parallelität : Wählen Sie Lesen Sie die festgelegten oder wiederholbaren Lesen aus, um Leistung und Datenkonsistenz auszugleichen.
Die Datenkonsistenz muss streng garantiert werden : Wählen Sie serialisierbar , wodurch sichergestellt wird, dass Transaktionen vollständig isoliert sind, die Leistung jedoch stark beeinträchtigt wird.
Anwendungen mit hohen Leistungsanforderungen : Im Fall von hohen Leistungsanforderungen können Sie unbekannt lesen , aber vorsichtig mit dem Leseproblem.
Bei Verwendung der MySQLI -Erweiterung in PHP ist das Einstellen des Isolationsniveaus einer Transaktion eine sehr wichtige Operation. Durch die Verwendung der Anweisung "Set Transaction Isolation Level" können wir die Isolationsstufe vor MySQLI :: begin_transaktion anpassen, um die Zuverlässigkeit und Konsistenz der Transaktionsausführung sicherzustellen. Die Auswahl der geeigneten Isolationsstufe hat einen wichtigen Einfluss auf die Datenbankleistung und die Datenkonsistenz. Während des Entwicklungsprozesses sollte die entsprechende Transaktions -Isolationsebene entsprechend den Geschäftsbedürfnissen sorgfältig ausgewählt werden.
Verwandte Tags:
mysqli