Ich denke, es gibt ein Missverständnis darüber, was eine Transaktion hier ausmacht.
Ihr Beispiel öffnet eine Verbindung und führt dann eine Transaktion darauf aus. Sie führen in dieser Transaktion mehrere SQL-Anweisungen aus, aber Sie schließen sie nach dem Commit vollständig. Natürlich ist das mehr als in Ordnung.
mehrere Ausführen Transaktionen (im Gegensatz zu nur SQL-Anweisungen), sieht wie folgt 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 verpflichtet 10 Transaktionen, die jeweils aus 10 Einzelaussagen löschen.
Und ja, Sie sollten in der Lage sein, die offene Verbindung für diese ohne Probleme wieder zu verwenden, solange Sie diese Verbindung zwischen Threads nicht teilen.
Zum Beispiel verwendet SQLAlchemy Verbindungen erneut, indem sie diese zusammenfasst und offene Verbindungen nach Bedarf an die Anwendung ausgibt. Neue Transaktionen und neue Anweisungen werden für diese Verbindungen während der gesamten Lebensdauer einer Anwendung ausgeführt, ohne dass sie geschlossen werden müssen, bis die Anwendung heruntergefahren wird.
Schade, dass Sie Ihren Fehler nicht verlassen haben. Ich war wirklich verwirrt, bevor ich die Revisionen gelesen habe, weil ich nicht gesehen habe, worüber das Missverständnis Martijn Pieters sprach. –