Bei verschachtelten MySQL-Transaktionen aufgetretene Probleme

Bei verschachtelten MySQL-Transaktionen aufgetretene Probleme

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.) 


Obwohl ich am Ende zurückgesetzt habe, zeigten die Daten 1 2 3. Ursprünglich dachten alle, dass meine Transaktion, obwohl sie sich in einem verschachtelten Zustand befand, am Ende zurückgesetzt wurde. Tatsächlich hoffen wir, dass das Ergebnis, das wir sehen, darin besteht, dass die Untertransaktion erfolgreich ausgeführt wird und der Fehler der äußeren Transaktion zurückgesetzt wird. Dies ist jedoch nicht der Fall, das Endergebnis ist 1 2 3 .

+-----+ 
| n | 
+-----+ 
| 1 | 
| 2 | 
| 3 | 
+-----+ 

Wenn der SQL-Interpreter auf „Transaktion starten“ stößt, wird ein Commit ausgelöst … !!!

begin_1 sql_1 begin_2 sql_2 sql_3 commit_1 rollback_1 .

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:
  • Zwei Lösungen zur Implementierung verschachtelter MySQL-Transaktionen in PHP
  • Beispiel für eine gespeicherte MySQL-Prozedur (einschließlich Transaktionen, Ausgabeparameter, verschachtelte Aufrufe)

<<:  Lassen Sie uns über das v-on-Parameterproblem in Vue sprechen

>>:  So implementieren Sie Hot Deployment und Hot Start in Eclipse/Tomcat

Artikel empfehlen

Führt diese SQL-Schreibmethode wirklich dazu, dass der Index fehlschlägt?

Vorwort Im Internet gibt es häufig Artikel, die v...

Zusammenfassung der Blockelemente, Inline-Elemente und variablen Elemente

Blockelement p - Absatz Text vorformatieren Tisch ...

Zusammenfassung des MySQL Undo Log und Redo Log

Inhaltsverzeichnis Undo-Protokoll Erstellung und ...

HTML-Tutorial: Sortierte Listen

<br />Originaltext: http://andymao.com/andy/...

So stellen Sie MySQL so ein, dass die Groß-/Kleinschreibung nicht beachtet wird

MySQL auf Groß-/Kleinschreibung eingestellt Windo...

Zusammenfassung einiger gängiger Verwendungen von Refs in React

Inhaltsverzeichnis Was sind Refs 1. Referenzen vo...

Erläuterung der Ausführungspriorität von mySQL-Schlüsselwörtern

Wie unten dargestellt: aus Tabelle wobei Bedingun...

Beim Bereitstellen von rabbitmq mit Docker sind zwei Probleme aufgetreten

1. Hintergrund Die folgenden zwei Probleme treten...

Linux-Tutorial zum Ersetzen von Zeichenfolgen mit dem Befehl sed

Um eine Zeichenfolge zu ersetzen, müssen wir das ...

So lösen Sie das Problem „Nginx 503-Dienst vorübergehend nicht verfügbar“

In letzter Zeit tritt nach dem Aktualisieren der ...

Drei Prinzipien effizienten Navigationsdesigns, die Webdesigner kennen müssen

Das Entwerfen der Navigation für eine Website ist...

Eine kurze Analyse der Verwendung von USING und HAVING in MySQL

Dieser Artikel veranschaulicht anhand von Beispie...

Erfahren Sie mehr über den Ereignisplaner EVENT in MySQL

Der Ereignisplaner in MySQL, EVENT, wird auch als...