2012-01-12 14 views
5

ho letto nella docs:Una transazione inizia anche su SELECT?

... dal momento che le operazioni iniziano quando un cursore esegue una query, ma fine quando commit o rollback viene eseguito dall'oggetto Connection.

import MySQLdb 

db = MySQLdb.connect(user="root", db="test") 
c = db.cursor() 
c.execute("SELECT * FROM books") 
print c.fetchall() 

Ho il sospetto che MySQLdb avvia una transazione anche su query che non modificano i dati (come SELEZIONA), perché è difficile sapere se una query legge solo i dati e non scriverlo.

  1. È vero?
  2. Se è così, questo significa che dovrei fare cursor.commit() dopo ogni query, per essere sicuro che nessuna tabella sia bloccata?
  3. Altri problemi di cui non sono a conoscenza?

Grazie

risposta

3

Sì, una dichiarazione SELECT è come le altre in modo inizia la transazione.

Se si vuole evitare questo, si potrebbe fare qualcosa di simile:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM books ; 
COMMIT ; 

In dettaglio:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

dice che le seguenti istruzioni in grado di leggere le righe che sono state modificate, ma che non ho ancora ricevuto uno COMMIT. Questo tipo di transazione non ottiene serrature esclusive.

La seconda parte SELECT * FROM books ; è ovviamente una SQL statement e la terza parte COMMIT ; termina la transazione e la rende "permanente". In tal caso non scritture sono fatte, in modo che il COMMIT viene utilizzato solo per terminare la transazione e

+0

Potrebbe spiegare il tuo esempio, e perché 'è ancora necessaria commit'? – warvariuc

+0

@warwaruk: questa domanda è stata aggiornata? Perché ricordo che era diverso. – DonCallisto

+0

No, non è stato aggiornato ... – warvariuc

1
  1. è vero, ma pure impegna automaticamente dopo ogni query, perché i clienti di MySQL iniziano con autocommit=1 di default

  2. non si dovrebbe, poiché SELECT non contiene alcun blocco dopo l'esecuzione dell'istruzione. In pratica, i commit espliciti potrebbero persino causare un significativo rallentamento.

  3. appena potrebbe essere utile: Why connection in Python's DB-API does not have "begin" operation?

+0

'autocommit = 1' non è vero per Python' MySQLdb'! Devi impostarlo in modo esplicito.Questa è una fonte comune di equivoci in Python alla "Dove sono i dati che ho appena inserito?". –

+1

@ ocaso-protal, hmm, vero. Perché lo penso ancora, dopo aver rimosso il paramerer 'init_command' che ha impostato autocommit = 0 dalle mie impostazioni di connessione molto tempo fa? – newtover

Problemi correlati