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

So deinstallieren Sie MySQL sauber (getestet und effektiv)

Wie deinstalliere ich Mysql vollständig? Befolgen...

Webpack erstellt ein Gerüst zum Verpacken von TypeScript-Code

Erstellen eines Ordners Verzeichnisstruktur: daba...

Schritte der MySQL-Methode zum Bestimmen, ob es sich um eine Teilmenge handelt

Inhaltsverzeichnis 1. Problem 2. Lösung Option 1:...

Freigabe der Schritte zum SVN-Dienstsicherungsvorgang

Schritte zur Sicherung des SVN-Dienstes 1. Quells...

So installieren Sie die Odoo12-Entwicklungsumgebung unter Windows 10

Vorwort Da viele Freunde sagen, dass sie keinen M...

Verwenden Sie reines JS, um den sekundären Menüeffekt zu erzielen

In diesem Artikelbeispiel wird der spezifische JS...

Mysql, einige komplexe SQL-Anweisungen (Abfragen und Löschen doppelter Zeilen)

1. Suchen Sie nach doppelten Zeilen Wählen Sie * ...

Native JavaScript-Implementierung des Fortschrittsbalkens

Der spezifische Code für JavaScript zur Implement...

Lösung zum automatischen Neustart von MySQL

Vorwort Kürzlich trat in der Testumgebung ein Pro...

Detaillierte Erläuterung des Linux-Textverarbeitungsbefehls sort

sort Den Inhalt einer Textdatei sortieren Verwend...

Dieser Artikel zeigt Ihnen, was Vite mit der Anfrage des Browsers macht

Inhaltsverzeichnis Funktionsprinzip: Was macht de...

Mit CSS3 lässt sich ein umdrehbarer Hover-Effekt erzielen

CSS3 implementiert einen umdrehbaren Hover-Effekt...