Myślę, że istnieje nieporozumienie dotyczące tego, co stanowi tutaj transakcję.
Twój przykład otwiera jedno połączenie, a następnie wykonuje jedno transakcja na nim. W tej transakcji wykonujesz wiele instrukcji SQL, ale po zatwierdzeniu zamykasz ją całkowicie. Oczywiście to więcej niż w porządku.
Wykonywanie wielu transakcji (w przeciwieństwie do instrukcji SQL) wygląda tak:
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()
Powyższy kod zatwierdza 10 transakcji, z których każda składa się z 10 indywidualnych instrukcji usuwania.
I tak, powinieneś móc bez problemu ponownie użyć otwartego połączenia, o ile nie dzielisz tego połączenia między wątkami.
Na przykład SQLAlchemy ponownie wykorzystuje połączenia, łącząc je, udostępniając otwarte połączenia w razie potrzeby do aplikacji. Nowe transakcje i nowe wyciągi są wykonywane na tych połączeniach przez cały okres istnienia aplikacji, bez konieczności ich zamykania do momentu zamknięcia aplikacji.