Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQLdb mit mehreren Transaktionen pro Verbindung

Ich glaube, es gibt ein Missverständnis darüber, was hier eine Transaktion ausmacht.

Ihr Beispiel öffnet eine Verbindung und führt dann eine aus Transaktion darauf. Sie führen mehrere SQL-Anweisungen in dieser Transaktion aus, schließen sie aber nach dem Festschreiben vollständig. Das ist natürlich mehr als in Ordnung.

Ausführen mehrerer Transaktionen (im Gegensatz zu reinen SQL-Anweisungen) sieht so aus:

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")

for j in range(10):
    try:
        for i in range(10):
            cur = conn.cursor()
            query = "DELETE FROM SomeTable WHERE ID = %d" % i
            cur.execute(query)
            cur.close()
        conn.commit()
    except Exception:
        conn.rollback()

conn.close()

Der obige Code schreibt 10 Transaktionen fest, die jeweils aus 10 einzelnen Löschanweisungen bestehen.

Und ja, Sie sollten in der Lage sein, die offene Verbindung dafür problemlos wiederzuverwenden, solange Sie diese Verbindung nicht zwischen Threads teilen.

Beispiel:SQLAlchemy verwendet Verbindungen wieder, indem es sie zusammenfasst und offene Verbindungen nach Bedarf an die Anwendung weitergibt. Neue Transaktionen und neue Anweisungen werden auf diesen Verbindungen während der gesamten Lebensdauer einer Anwendung ausgeführt, ohne dass die Anwendung geschlossen werden muss, bis die Anwendung heruntergefahren wird.