Das grundlegende Konzept einer Transaktion ist "entweder alle erfolgreich oder alle scheitern". Wenn ein Betrieb in der Transaktion fehlschlägt, werden alle Vorgänge in der Transaktion zurückgerollt (widerrufen). Transaktionen enthalten normalerweise die folgenden vier Merkmale (Säureprinzip):
Atomizität : Alle Operationen in einer Transaktion sind entweder abgeschlossen oder nicht abgeschlossen.
Konsistenz : Eine Transaktion muss die Datenbank von einem konsistenten Zustand in einen anderen übergeben.
Isolierung : Die Ausführung einer Transaktion sollte nicht durch andere Transaktionen gestört werden.
Haltbarkeit : Sobald eine Transaktion festgelegt ist, sollten die Daten dauerhaft sein und nicht verloren gehen.
In MySQL -Datenbanken beruhen Transaktionen hauptsächlich auf die InnoDB Storage Engine, da InnoDB Transaktionen unterstützt, während andere Speichermotoren wie MyISAM dies nicht tun.
In PHP wird die Funktion MySQLI :: begin_transaktion verwendet, um eine Transaktion explizit zu starten. Nach dem Aufrufen dieser Funktion startet MySQL eine Transaktion, ohne die Daten sofort einzureichen oder zurückzusetzen, bis der Entwickler explizit Commit () oder Rollback () aufruft.
<span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>
Die Funktion hat keine Parameter und der Rückgabewert ist ungültig , dh kein Ergebnis wird zurückgegeben. Es wird hauptsächlich zum Starten von Transaktionen verwendet, wonach Sie eine Reihe von Datenbankvorgängen ausführen können.
Verbindung mit der Datenbank : Erstens müssen Sie eine Datenbankverbindung über MySQLI_Connect oder objektorientierte Methode herstellen.
Starten Sie eine Transaktion : Call begin_transaktion , um die Transaktion zu starten.
Führen Sie SQL -Operationen aus : Führen Sie eine Reihe von SQL -Operationen in einer Transaktion durch, wie z. B. Einfügen, Aktualisierung oder Löschen von Daten.
Commit oder Rollback : Entscheiden Sie, ob Sie auf der Grundlage des Ausführungsergebnisses eingehen oder einen Rollback haben .
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Eine Verbindung erstellen</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-comment">// Überprüfen Sie die Verbindung</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">// 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">// implementieren SQL arbeiten</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 users (name, email) VALUES ('Alice', '[email protected]')"</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 users SET email = '[email protected]' WHERE name = 'Bob'"</span></span><span>);
</span><span><span class="hljs-comment">// Wenn es keinen Fehler gibt,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">// Wenn ein Fehler auftritt,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 Verbindung</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 Fehlerbehandlung ist bei der Verwendung von Transaktionen von entscheidender Bedeutung. Normalerweise fangen wir Ausnahmen über die Anweisung Try-Catch und rollen die Transaktion zurück, wenn ein Fehler auftritt. Dies stellt sicher, dass selbst wenn ein Betrieb in der Mitte fehlschlägt, alle früheren Vorgänge widerrufen werden und die Datenbankkonsistenz beibehalten wird.
Im obigen Code erfolgt unter der Annahme, dass ein Fehler bei der Durchführung von SQL-Operationen (z. B. Konflikte zur Datenbankbeschränkung) auftritt, der Fangblock erfasst diesen Fehler und rollt alle Datenbankvorgänge über $ mysqli-> rollback () zurück.
Commit -Transaktion : Wenn alle Vorgänge in der Transaktion erfolgreich ausgeführt werden, kann die Verpflichtung () -Methode aufgerufen werden, um die Transaktion einzureichen, was bedeutet, dass alle Änderungen in der Datenbank dauerhaft gespeichert werden.
Rollback : Wenn in der Transaktion ein Fehler auftritt, rufen Sie die Rollback () -Methode auf, um alle zuvor durchgeführten SQL -Operationen zu widerrufen und die Datenbank vor Beginn der Transaktion in den Status wiederherzustellen.
Festlegung und Rollback sind der Schlüssel zur Transaktionskontrolle und zur Bestimmung des Endergebnisses der Transaktion.
<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-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>
Automatik -Einreichungsmodus : MySQL ermöglicht standardmäßig den Automatik -Einreichungsmodus, dh jede SQL -Anweisung wird unmittelbar nach seiner Ausführung eingereicht. Wenn Sie Transaktionen verwenden möchten, müssen Sie den AutoCommit -Modus manuell deaktivieren. Die Automatikübermittlung kann über MySQLI-> AutoCommit (False) deaktiviert werden.
Beispiel:
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">autocommit</span></span><span>(</span><span><span class="hljs-literal">FALSE</span></span><span>); </span><span><span class="hljs-comment">// Deaktivieren Sie die Automatikübermittlung</span></span><span>
</span></span>
Nistung von Transaktionen : MySQL unterstützt keine realen verschachtelten Transaktionen. Wenn Sie eine weitere Transaktion in einer Transaktion starten, wirkt sich das Commit oder Rollback einer internen Transaktion nicht auf die externe Transaktion aus.
Verwandte Tags:
mysqli