2012-01-12 16 views
5

leí en el docs:¿Se inicia una transacción incluso en SELECT?

... ya que las transacciones comienzan cuando un cursor ejecutar una consulta, pero final cuando COMMIT o ROLLBACK es ejecutado por el objeto conexión.

import MySQLdb 

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

Sospecho que MySQLdb inicia una transacción, incluso en las consultas que no modifican datos (como SELECT), debido a que es difícil saber si una consulta sólo lee los datos y no escribe ella.

  1. ¿Es cierto?
  2. Si es así, esto significa que debo hacer cursor.commit() después de cada consulta, para asegurarme de que no haya ninguna tabla bloqueada.
  3. Otros problemas que desconozco?

Gracias

Respuesta

3

Sí, una declaración SELECT es como otros así, se inicia la transacción.

Si se quiere evitar esto, se podía hacer algo así:

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

En detalle:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

dice que la siguiente instrucción podía leer las filas que se han modificado pero que todavía no ha recibido un COMMIT. Ese tipo de transacción no tiene cerraduras exclusivas.

La segunda parte SELECT * FROM books ; es obviamente una SQL statement y la tercera parte COMMIT ; finaliza la transacción y la convierte en "permanente". En ese caso no hay escrituras se realizan, por lo que el COMMIT se utiliza sólo para terminar la transacción y

+0

Podría explicar su ejemplo, y por qué es necesario hacer un 'commit'? – warvariuc

+0

@warwaruk: ¿se ha actualizado esta pregunta? Porque recuerdo que fue diferente. – DonCallisto

+0

No, no se actualizó ... – warvariuc

1
  1. es cierto, pero también se compromete de forma automática después de cada consulta, ya que los clientes de MySQL comienzan con autocommit=1 por defecto

  2. no debería, ya SELECT no mantiene bloqueos después de que se ejecuta la sentencia. En la práctica, las confirmaciones explícitas pueden incluso causar una desaceleración significativa.

  3. sólo podría ser útil: Why connection in Python's DB-API does not have "begin" operation?

+0

'autocommit = 1' no es verdadero para Pythons' MySQLdb'! Tienes que configurar esto explícitamente.Esa es una fuente común de malentendidos en Python a la "¿Dónde están los datos que acabo de insertar?". –

+1

@ ocaso-protal, hmm, cierto. ¿Por qué todavía lo creo, después de haber eliminado el parámetro 'init_command' configuración autocommit = 0 de mi configuración de conexión hace mucho tiempo? – newtover

Cuestiones relacionadas