Mysql
 sql >> Database >  >> RDS >> Mysql

MySQLdb con più transazioni per connessione

Penso che ci sia un malinteso su ciò che costituisce una transazione qui.

Il tuo esempio apre una connessione, quindi ne esegue uno transazione su di esso. Esegui più istruzioni SQL in quella transazione, ma la chiudi completamente dopo aver eseguito il commit. Ovviamente va più che bene.

Esecuzione di più transazioni (al contrario delle sole istruzioni SQL), si presenta così:

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()

Il codice sopra commette 10 transazioni, ciascuna composta da 10 istruzioni di eliminazione individuali.

E sì, dovresti essere in grado di riutilizzare la connessione aperta per questo senza problemi, purché non condivida quella connessione tra i thread.

Ad esempio, SQLAlchemy riutilizza le connessioni mettendole in pool, distribuendo le connessioni aperte secondo necessità all'applicazione. Nuove transazioni e nuove istruzioni vengono eseguite su queste connessioni per tutta la durata di un'applicazione, senza che sia necessario chiuderle fino alla chiusura dell'applicazione.