MySQL unterstützt verschachtelte Transaktionen, aber nicht viele Leute tun das ... Vor einiger Zeit habe ich einige Ausländer über die Notwendigkeit verschachtelter MySQL-Transaktionen streiten hören. Es ist so lustig, gibt es irgendein Szenario, in dem diese verschachtelte, seltsame Verwendung notwendig ist? Ich habe mit meinem ehemaligen DBA-Kollegen gesprochen und erfahren, dass verschachtelte MySQL-Transaktionen in keinem Szenario verwendet werden sollten. Auf welche Probleme können Sie also stoßen, wenn Sie verschachtelte MySQL-Transaktionen verwenden? mysql> wähle * von ceshi; +------+ | n | +------+ | 1 | +------+ 1 Zeile im Satz (0,00 Sek.) mysql> Transaktion starten; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> in Ceshi-Werte einfügen (2); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> Transaktion starten; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> in Ceshi-Werte einfügen (3); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> festschreiben; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Rollback; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
+-----+ | n | +-----+ | 1 | | 2 | | 3 | +-----+ Wenn der SQL-Interpreter auf „Transaktion starten“ stößt, wird ein Commit ausgelöst … !!! Wenn begin_2 ausgeführt wird, wurde sql_1 bereits festgeschrieben. Wenn Sie commit_1 ausführen, wurden sql_2 und sql_3 bereits festgeschrieben. Wenn Sie zu diesem Zeitpunkt ein Rollback durchführen, ist dies nutzlos ... da sie bereits festgeschrieben wurden. Was können Sie also zurücksetzen ... Wie bereits erwähnt, verwenden in der Architektur nur wenige Leute verschachtelte Transaktionen, aber manchmal werden sie versehentlich verschachtelt. Nehmen wir das Python-Projekt als Beispiel. Zuerst verwenden wir Dekoratoren, um die Transaktionspaketierung zu implementieren. Dann werden die Datenverarbeitungsfunktionen def a() und def b() in Transaktionen verpackt. Es spielt keine Rolle, ob wir einfach a oder b verwenden, da es sich bei allen um einzelne Transaktionen handelt. Was passiert, wenn A in der Logik B aufruft? Ja, Transaktionen sind verschachtelt ... Ich denke, das ist ein Problem, mit dem die meisten Geschäftsentwickler konfrontiert werden. Wie lässt sich dieses Risiko also vermeiden? Sie können es sperren... Richten Sie eine globale Sperre ein und überprüfen Sie den Sperrstatus, bevor Sie eine Untertransaktion erstellen... Wenn Sie das Flask-Framework verwenden, können Sie die globale Flask-Variable g verwenden. Wenn es sich um das 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 oder Gevent handelt, können Sie fd verwenden, um die Coroutine-Variablen zuzuordnen. @Dekorateur def mit_Transaktion(f, *args, **kwargs): db = Verbindung.get_db_by_table("*") versuchen: db.begin() ret = f(*args, **kwargs) db.commit() außer: db.rollback() erheben Rückkehr zurück @mit_Transaktion def verstecken(selbst): '''Bestellungen werden nicht in der App angezeigt''' wenn self.status nicht in OrderStatus.allow_deletion_statuses() ist: Erhöhen Sie OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted) ... @mit_Transaktion def change_receipt_info(selbst, Adresse, Name, Telefon): region = Region.get_by_address(Adresse) ... Wenn wir die folgende Anweisung ausführen, wird die Transaktion zum Commit gezwungen. Natürlich gilt hier autocommit = True. ALTER FUNCTION ALTER-VERFAHREN ALTER TABLE BEGINNEN DATENBANK ERSTELLEN FUNKTION ERSTELLEN INDEX ERSTELLEN VERFAHREN ERSTELLEN TABELLE ERSTELLEN DATENBANK LÖSCHEN DROP-FUNKTION DROP-INDEX DROP-VERFAHREN DROP-TABELLE TABELLEN ENTSPERREN STAMMDATEN LADEN Sperrtabellen TABELLE UMBENENNEN TRUNCATE-TABELLE AUTOCOMMIT festlegen = 1 TRANSAKTION STARTEN Das könnte Sie auch interessieren:
|
<<: Lassen Sie uns über das v-on-Parameterproblem in Vue sprechen
>>: So implementieren Sie Hot Deployment und Hot Start in Eclipse/Tomcat
Vorwort Im Internet gibt es häufig Artikel, die v...
Blockelement p - Absatz Text vorformatieren Tisch ...
Inhaltsverzeichnis Undo-Protokoll Erstellung und ...
<br />Originaltext: http://andymao.com/andy/...
MySQL auf Groß-/Kleinschreibung eingestellt Windo...
Inhaltsverzeichnis Was sind Refs 1. Referenzen vo...
Wie unten dargestellt: aus Tabelle wobei Bedingun...
1. Hintergrund Die folgenden zwei Probleme treten...
Bereiten Sie eine CentOS6-Installationsdiskette (...
Um eine Zeichenfolge zu ersetzen, müssen wir das ...
In letzter Zeit tritt nach dem Aktualisieren der ...
Das Entwerfen der Navigation für eine Website ist...
Dieser Artikel veranschaulicht anhand von Beispie...
Informationen zu CSS3-Variablen Fügen Sie beim De...
Der Ereignisplaner in MySQL, EVENT, wird auch als...