In diesem Artikel werden hauptsächlich relevante Informationen zu den Problemen vorgestellt, die bei verschachtelten MySQL-Transaktionen auftreten.
MySQL unterstützt verschachtelte Transaktionen, aber nicht viele Leute tun dies. Ich habe einige Ausländer gesehen, die über die Notwendigkeit verschachtelter MySQL-Transaktionen im Ausland diskutierten. Es amüsiert mich zu Tode. Warum ist diese Verwendung von verschachtelten Geistern für die Szene notwendig? Ich habe mit meinen ehemaligen DBA-Kollegen gesprochen und erfahren, dass in keinem Szenario verschachtelte MySQL-Transaktionen verwendet werden sollten.
Auf welche Probleme werden Sie also stoßen, wenn Sie verschachtelte MySQL-Transaktionen verwenden?
mysql> select * from ceshi; +------+ | n | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> start transaction ; Query OK, 0 rows affected (0.00 sec) mysql> insert into ceshi values(2); Query OK, 1 row affected (0.00 sec) mysql> start transaction ; Query OK, 0 rows affected (0.00 sec) mysql> insert into ceshi values(3); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec)
Obwohl ich am Ende einen Rollback durchgeführt habe, aber die Datenanzeige ist 1 2 3 Ursprünglich dachten alle, dass sich meine Transaktion am Ende so anfühlte, als wäre sie zurückgesetzt worden. Tatsächlich wollen wir sehen, dass die Untertransaktion ausgeführt wird erfolgreich, und der Fehler der äußeren Transaktion wird zurückgegeben. Dies ist jedoch nicht der Fall. Das Endergebnis ist 1 2 3.
+-----+ | n | +-----+ | 1 | | 2 | | 3 | +-----+Wenn der SQL-Interpreter auf eine Starttransaktion stößt, erfolgt ein Commit ausgelöst. … !!! Wenn Sie zu diesem Zeitpunkt zum Rollback wechseln, ist es definitiv nutzlos ... Da es bereits übermittelt wurde, was können Sie tun, um ein Rollback durchzuführen ...Wie bereits erwähnt, In Bezug auf die Architektur gibt es im Allgemeinen nur sehr wenige Leute, die verschachtelte Transaktionen verwenden, aber manchmal werden sie versehentlich verschachtelt. Nehmen wir als Beispiel das Python-Projekt, um die Transaktionspaketierung zu implementieren. Dann werden die Datenverarbeitungsfunktionen def a() und def b() durch Transaktionen umschlossen . Einzeltransaktion. Was passiert, wenn eine Logik b erneut aufruft? Ja, Transaktionen sind verschachtelt ... Ich denke, dass dies ein Problem ist, auf das die meisten Geschäftsentwicklungen stoßen werden.
begin_1 sql_1 begin_2 sql_2 sql_3 commit_1 rollback_1 .
Wie kann man dieses Risiko vermeiden? Sie können eine Sperre hinzufügen ... Richten Sie eine globale Sperre ein, und der Sperrstatus wird beurteilt, bevor die Untertransaktion erstellt wird ...
Wenn Sie ein Flask-Framework verwenden, können Sie globale Variablen von Flask G verwenden.
Wenn es sich um ein Django-Framework handelt, können Sie Thread Local verwenden, um globale Variablen zu verwenden.
Wenn es sich um eine asynchrone E/A-Architektur wie Tornado und Gevent handelt, können Sie fd verwenden, um Coroutine-Variablen zuzuordnen.
Wenn wir die folgende Anweisung ausführen, wird die Transaktion zum Commit gezwungen. Die Voraussetzung hier ist natürlich Autocommit = True.@decorator def with_transaction(f, *args, **kwargs): db = connection.get_db_by_table("*") try: db.begin() ret = f(*args, **kwargs) db.commit() except: db.rollback() raise return ret @with_transaction def hide(self): '''订单不在app端显示''' if self.status not in OrderStatus.allow_deletion_statuses(): raise OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted) ... @with_transaction def change_receipt_info(self, address, name, phone): region = Region.get_by_address(address) ...Das Obige ist eine detaillierte Erläuterung der Codebeispiele für Probleme, die bei verschachtelten MySQL-Transaktionen auftreten. Weitere verwandte Inhalte finden Sie in PHP Chinesische Website (www.php.cn)!
ALTER FUNCTION ALTER PROCEDURE ALTER TABLE BEGIN CREATE DATABASE CREATE FUNCTION CREATE INDEX CREATE PROCEDURE CREATE TABLE DROP DATABASE DROP FUNCTION DROP INDEX DROP PROCEDURE DROP TABLE UNLOCK TABLES LOAD MASTER DATA LOCK TABLES RENAME TABLE TRUNCATE TABLE SET AUTOCOMMIT=1 START TRANSACTION