2009-10-24 21 views
11

actualizado Tengo un script que espera hasta que alguna fila en una base de datos se actualiza:Python no conseguir fila

con = MySQLdb.connect(server, user, pwd, db) 

Cuando el guión comienza el valor de la fila es "running", y espera a que el valor para convertirse en "finished"

while(True): 
    sql = '''select value from table where some_condition''' 
    cur = self.getCursor() 
    cur.execute(sql) 
    r = cur.fetchone() 
    cur.close() 
    res = r['value'] 
    if res == 'finished': 
     break 
    print res 
    time.sleep(5) 

Cuando ejecuto este script, se cuelga para siempre. Aunque veo que el valor de la fila ha cambiado a "finished" cuando consulto la tabla, la impresión de la secuencia de comandos sigue siendo "running".

¿Hay alguna configuración que no configuré?

EDITAR: El script de python solo consulta la tabla. La actualización de la tabla se lleva a cabo mediante una aplicación web tomcat, utilizando JDBC, que se configura en autocommit.

Respuesta

17

Esta es una tabla InnoDB, ¿verdad? InnoDB es un motor de almacenamiento transaccional. Establecer autocommit en true probablemente arreglará este comportamiento por usted.

conn.autocommit(True) 

Como alternativa, puede cambiar el nivel de aislamiento de transacción. Puedes leer más sobre esto aquí: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

La razón de este comportamiento es que dentro de una sola transacción las lecturas deben ser consistentes. Todas las lecturas consistentes dentro de la misma transacción leen la instantánea establecida por la primera lectura. Incluso si el script solo lee la tabla, esto también se considera una transacción. Este es el comportamiento predeterminado en InnoDB y necesita cambiarlo o ejecutar conn.commit() después de cada lectura.

esta página se explica esto con más detalles: http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

+0

Es un InnoDB. Pero el script de python solo consulta la tabla. La actualización de la tabla se lleva a cabo mediante una aplicación web tomcat, utilizando JDBC, que * se * establece en autocommit. – olamundo

+0

Agregué más detalles para explicar el comportamiento –

3

trabajé en torno a esta ejecutando

c.execute("""set session transaction isolation level READ COMMITTED""") 

al principio de mi sesión de lectura. Las actualizaciones de otros hilos llegan ahora.

En mi caso, mantuve las conexiones abiertas durante mucho tiempo (dentro de mod_python) y las actualizaciones por otros procesos no se veían en absoluto.

Cuestiones relacionadas