Pregunta

utilizo MySQL con módulo de MySQLdb en Python, en Django.

Estoy corriendo en modo de confirmación automática en este caso (y transaction.is_managed de Django () en realidad devuelve Falso).

Tengo varios procesos que interactúan con la base de datos.

Un proceso obtiene todos los modelos tarea con Task.objects.all ()

A continuación, otro proceso añade un modelo de tareas (que se puede ver en una aplicación de gestión de base de datos).

Si llamo Task.objects.all () en el primer proceso, no veo nada. Pero si llamo connection._commit () y luego Task.objects.all (), veo la nueva tarea.

Hay almacenamiento temporal implicada en el nivel de conexión:

Mi pregunta es? Y es un comportamiento normal (no se parece a mí)?

¿Fue útil?

Solución

Esto ciertamente parece bloqueo de confirmación automática / table - relacionados

.

Si MySQLdb implementa la especificación dbapi2 es probable que tenga una conexión se ejecuta como una transacción única y continua. Cuando uno dice: 'running in autocommit mode': Qué quiere decir MySQL en sí o el módulo de MySQLdb? O Django?

No intermitentemente cometer perfectamente explica el comportamiento que está recibiendo:

i) una conexión implementado como una sola transacción en MySQLdb (por defecto, probablemente)

Conexiones de ii) no apertura / cierre sólo cuando sea necesario, pero (re) utilizando uno (o más) conexiones de bases de datos persistentes (mi conjetura, podría ser Django-arquitectura heredada).

ii) seleccionado por su ( 'lee') causan un 'bloqueo de lectura simple' en una mesa (que significa otras conexiones todavía se puede 'leer' esta mesa, pero las conexiones que desean 'escritura de datos' puede 't (inmediatamente) debido a este bloqueo les impide obtener un 'bloqueo exclusivo'(necesaria 'para la escritura') en esta tabla. la escritura es por lo tanto pospuso indefinidamente (hasta que se pueda obtener una (corta) bloqueo exclusivo en la tabla para la escritura - cuando se cierra la conexión o manualmente comprometerse)

.

Yo haría lo siguiente en su caso:

  • Para saber cuales son los bloqueos de tabla en su base de datos durante el escenario anterior
  • leer sobre Django y transacciones aquí . Una rápida descremada sugiere el uso de la funcionalidad estándar de Django implícitamente provoca confirmaciones. Esto significa enviar SQL artesanal será quizá no (inserción, actualización ...).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top