Creo que hay un malentendido acerca de lo que constituye una transacción aquí.
Su ejemplo abre una conexión, luego ejecuta una transacción en ella. Ejecuta varias instrucciones SQL en esa transacción, pero la cierra completamente después de la confirmación. Por supuesto, eso está más que bien.
La ejecución de múltiples transacciones (en lugar de sólo las sentencias SQL), se ve así:
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()
El código anterior se compromete 10 transacciones, cada uno compuesto por 10 individuales delete.
Y sí, debería poder volver a utilizar la conexión abierta para eso sin problemas, siempre que no comparta esa conexión entre subprocesos.
Por ejemplo, SQLAlchemy reutiliza las conexiones uniéndolas, distribuyendo las conexiones abiertas según sea necesario para la aplicación. Se ejecutan nuevas transacciones y nuevas declaraciones en estas conexiones a lo largo de la vida útil de una aplicación, sin necesidad de cerrarlas hasta que se cierre la aplicación.
Lástima que no haya dejado su error. Realmente me confundí antes de leer las revisiones porque no veía cuál era el malentendido del que hablaba Martijn Pieters. –