Aktueller Standort: Startseite> Neueste Artikel> Wie sollte PDO :: BeginnTransaction verwendet werden, um Transaktions -Isolationsniveaus einzustellen, um Probleme mit Parallelität zu verhindern?

Wie sollte PDO :: BeginnTransaction verwendet werden, um Transaktions -Isolationsniveaus einzustellen, um Probleme mit Parallelität zu verhindern?

gitbox 2025-08-22

1. Was ist die Transaktions -Isolationsstufe?

Die Transaktions -Isolationsstufe definiert die Datenveränderungen anderer Transaktionen, wenn die Transaktion ausgeführt wird. Unterschiedliche Isolationsniveaus liefern unterschiedliche Grade der Datenisolierung, und die häufigen Isolationsniveaus umfassen:

  • Lesen Sie unbekannt
    Wenn eine Transaktion Daten lesen kann, die von einer anderen Transaktion nicht begangen werden, kann es zu schmutziger Lektüre führen.

  • Lesen Sie engagiert
    Nur eine Transaktion darf die festgelegten Daten lesen und schmutzige Messungen vermeiden, aber es können nicht wiederholbare Messwerte auftreten.

  • Wiederholbares Lesen
    Stellen Sie sicher, dass alle Abfragen in einer Transaktion dieselben Daten zurückgeben. Vermeiden Sie nicht wiederholbares Lesen, aber es kann noch Phantom-Lesen auftreten.

  • Serialisierbar
    Krafttransaktionen, die seriell ausgeführt werden sollen, um schmutziges Lesen, nicht wiederholbares Lesen und Phantom-Lesen vollständig zu vermeiden, aber die Leistung wird stark beeinflusst.

2. Setzen Sie die Transaktions -Isolationsstufe mit PDO

PDO ermöglicht das Einstellen von Transaktions -Isolationsniveaus, bevor Transaktionen beginnen. Diese Operation erfolgt normalerweise durch SQL -Anweisungen. Die spezifische Methode besteht darin, die Anweisung "Set Transaction Isolation Level" zu verwenden, um die erforderliche Isolationsstufe festzulegen, bevor PDO :: begintransaction () aufgerufen wird. Zum Beispiel:

 <span><span><span class="hljs-comment">// erstellen PDO Beispiel</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">// Stellen Sie die Transaktions -Isolationsstufe auf“Wiederholbar”</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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">// Starten Sie eine Transaktion</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

</span><span><span class="hljs-comment">// Datenbankvorgänge durchführen</span></span><span>
</span><span><span class="hljs-comment">// ...</span></span><span>

</span><span><span class="hljs-comment">// Transaktionen einreichen</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span></span>

Setzen Sie im obigen Code die Wiederholungslese -Lesestufe der Transaktionisolation fest, die die Transaktions -Isolationsstufe auf wiederholbares Lesen festlegt. Dies bedeutet, dass die in der aktuelle Transaktion ausgeführte Abfrage immer das gleiche Ergebnis zurückgibt, selbst wenn andere Transaktionen die dazwischen liegenden Daten ändern.

3. Vorbeugung häufiger Transaktions -Isolationsniveaus bei Parallelitätsproblemen

Unterschiedliche Transaktions -Isolationsniveaus haben unterschiedliche Auswirkungen auf Parallelitätsprobleme. Hier sind ihre spezifischen Manifestationen bei der Verhinderung von Parallelitätsproblemen:

  • Lesen Sie unbekannt
    Nach dieser Isolationsebene können Transaktionen Daten lesen, die andere Transaktionen nicht begangen haben, die schmutzige Messungen verursachen und somit inkonsistente Daten verursachen. Parallelitätsprobleme sind sehr anfällig für eintreten, da der Betrieb anderer Transaktionen keine Einschränkung vorliegt.

  • Lesen Sie engagiert
    Diese Isolationsstufe vermeidet schmutzige Probleme mit Leseproblemen, da Transaktionen nur festgelegte Daten lesen können. Es kann jedoch weiterhin möglich sein, nicht wiederholbare Lesevorgänge zu haben, d. H. Wenn eine Transaktion die gleichen Daten zweimal liest, können sich die Daten ändern. Für einige Szenarien, in denen die Datenkonsistenz nicht hoch ist, kann diese Isolationsstufe Leistung und Konsistenz ausgleichen.

  • Wiederholbares Lesen
    Die wiederholbare Lese-Isolationsstufe stellt sicher, dass alle Abfragen in einer Transaktion konsistente Daten zurückgeben und nicht wiederholbare Lesevorgänge vermeiden. Es kann jedoch ein Phantom gelesen werden, d. H. Eine andere Transaktion fügt neue Daten zwischen der aktuellen Transaktionsabfrage ein. Diese Isolationsstufe hat eine strengere Kontrolle über gleichzeitige Schreibvorgänge, was zur Verbesserung der Datenkonsistenz beiträgt.

  • Serialisierbar
    Die Serialisierungs-Isolationsstufe ist das strengste und vermeidet alle Parallelitätsprobleme, einschließlich schmutziges Lesen, nicht wiederholbares Lesen und Fantasy-Lesen durch Erzwingen der Transaktionsserialisierung. Dieses Isolationsniveau hat einen großen Einfluss auf die Leistung und eignet sich normalerweise für Szenarien, in denen eine strenge Konsistenz erforderlich ist.

4. Wie kann man die Transaktions -Isolationsstufe basierend auf den Geschäftsanforderungen auswählen?

Die Auswahl des geeigneten Transaktions-Isolationsniveaus erfordert Kompromisse auf der Grundlage bestimmter Geschäftsanforderungen:

  • Wenn es sich um ein Anwendungsszenario handelt, das eine hohe Leistung erfordert, aber keine hohe Datenkonsistenz erfordert, können Sie die eingereichte Isolationsebene lesen . Dadurch werden schmutzige Lesevorgänge vermieden, während gleichzeitige Transaktionen die Daten ändern.

  • Wiederholbare Lesevorgänge sind für die meisten Anwendungen eine bessere Wahl, da sie nicht wiederholbare und schmutzige Lesevorgänge verhindern können und gleichzeitig die Datenkonsistenz sicherzustellen, dass der Leistungsverlust relativ gering ist.

  • In Systemen, die eine strikte Konsistenz von Daten und geringer Parallelität sicherstellen müssen, kann das serialisierte Isolationsniveau ausgewählt werden. Obwohl seine Leistung schlecht ist, kann es alle Probleme mit der Parallelität vollständig vermeiden.

5. Beispiel: Praktische Anwendung zur Verhinderung von Parallelitätsproblemen

Angenommen, wir entwickeln ein Bankensystem, das sicherstellen muss, dass der Konto des Benutzers aufgrund gleichzeitiger Vorgänge keine Fehler verursacht. Wir können verhindern, dass das in einer Transaktion abgefragte Gleichgewicht durch andere Transaktionen modifiziert wird, indem wir eine wiederholbare Lese -Isolationsstufe festlegen:

 <span><span><span class="hljs-comment">// erstellen PDO Beispiel</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>-&gt;</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">// Starten Sie eine Transaktion</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

</span><span><span class="hljs-comment">// Überprüfen Sie den Kontostand</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">fetchColumn</span></span><span>();

</span><span><span class="hljs-comment">// Bestimmte Geschäftslogik ausführen</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$balance</span></span><span> &gt; </span><span><span class="hljs-number">100</span></span><span>) {
    </span><span><span class="hljs-comment">// Abzugsbetrieb</span></span><span>
    </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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>-&gt;</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">// Transaktionen einreichen</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span></span>

In diesem Beispiel wird ein wiederholbares Lese -Isolationsniveau festgelegt, um sicherzustellen, dass sich das Abfragemotivangebot aufgrund von Änderungen anderer Transaktionen nicht ändert, wodurch Datenkonsistenzen vermieden werden.

6. Zusammenfassung

Pdo :: begintransaction () ist ein leistungsstarkes Tool, mit dem wir Datenbanktransaktionen in PHP verwalten können. Durch die Kombination mit angemessenen Einstellungen für Transaktions -Isolationsebene können wir effektiv Parallelitätsprobleme verhindern und Datenkonsistenz und Integrität sicherstellen. Während des Entwicklungsprozesses sollten wir die entsprechende Transaktions -Isolationsstufe basierend auf den Geschäftsbedürfnissen auswählen, um die Beziehung zwischen Leistung und Datenkonsistenz auszugleichen.

  • Verwandte Tags:

    PDO