sql >> Base de Datos >  >> RDS >> Mysql

MySQLdb con múltiples transacciones por conexión

Creo que hay un malentendido sobre lo que constituye una transacción aquí.

Su ejemplo abre una conexión, luego ejecuta one transacción en él. Ejecuta varias declaraciones SQL en esa transacción, pero la cierra por completo después de confirmar. Por supuesto que está más que bien.

Ejecutar múltiples transacciones (a diferencia de solo las declaraciones 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 confirma 10 transacciones, cada una de las cuales consta de 10 declaraciones de eliminación individuales.

Y sí, deberías poder reutilizar la conexión abierta para eso sin problemas, siempre y cuando no compartas esa conexión entre subprocesos.

Por ejemplo, SQLAlchemy reutiliza las conexiones agrupándolas, entregando conexiones abiertas según sea necesario para la aplicación. Las nuevas transacciones y las nuevas declaraciones se ejecutan en estas conexiones a lo largo de la vida útil de una aplicación, sin necesidad de cerrarse hasta que se cierre la aplicación.