2009-07-10 24 views
5

Tengo un proyecto de Django en el que varios procesos acceden al backend mysql db. Un proceso está creando registros, mientras que un segundo proceso está tratando de leer esos registros. Tengo un problema donde el segundo proceso que intenta leer los registros no puede encontrar los registros hasta que llamo manualmente a connection._commit().Múltiples procesos que acceden a Django db backend; registros que no aparecen hasta llamar manualmente _commit

Esta pregunta se ha hecho antes: caching issues in MySQL response with MySQLdb in Django

El PO indicó que él resolvió el problema, pero no acababa de explicar cómo. ¿Alguien puede arrojar algo de luz sobre esto? Me gustaría poder acceder a los registros sin llamar manualmente a _commit().

Gracias,

Asif

+0

Acabo de pasar todo el día buscando un error causado por la lectura repetible que interactúa con las transacciones ORM de Django. Si supiera exactamente qué debo buscar en google * antes * Encontré la respuesta de forma independiente ... –

Respuesta

5

Dijo:

confirmación automática de Django no es una confirmación automática real en el PP.

Por lo tanto, debe asegurarse de que la confirmación automática esté establecida en el nivel de base de datos. De lo contrario, debido al aislamiento de la transacción, los procesos no verán los cambios realizados por un proceso diferente (conexión diferente), hasta que se realice una confirmación. ¡AFAIK esto no es especialmente un problema de Django, aparte de la falta de claridad en los documentos acerca de autocomito Django! = Db autocommit.

Actualización: parafraseando ligeramente de la documentación de MySQL:

LEER REPETIBLE es el nivel de aislamiento predeterminado para InnoDB. Para las lecturas consistentes, hay una diferencia importante con el nivel de aislamiento de lectura confirmada : Todo las lecturas consistentes dentro de la misma transacción leer la instantánea establecida por la primera lectura. (Mi énfasis.)

Así, con READ REPETIBLE que sólo te dan, en lecturas posteriores, lo que se leyó en la primera lectura. Con READ COMMITTED, cada lectura crea y lee su propia instantánea, para que pueda ver las actualizaciones posteriores de otras transacciones. Entonces, en respuesta a su comentario, su cambio al nivel de transacción es correcto.

+1

Tenía el compromiso automático establecido en verdadero en el nivel db. Investigué un poco más y encontré la variable del sistema tx_isolation. El mío fue establecido en REPEATABLE-READ, que es el predeterminado para MySQL. Después de mirar la documentación, me enteré de que probablemente quería que esta variable se estableciera en LEA-COMPROMETIDO. Hice el cambio y las cosas parecen estar funcionando correctamente ahora. ¿Alguien puede confirmar que esta es la solución correcta para mi problema? –

0

¿Está ejecutando los procesos como puntos de vista? Si es así, probablemente se estén cometiendo cuando la solicitud haya terminado de procesarse, pero parece que estás ejecutando estos procesos al mismo tiempo. Si ejecuta el proceso fuera de una vista, deben comprometerse en cada guardado.

Cuestiones relacionadas