проблемы кеширования в ответе MySQL с MySQLdb в Django - PullRequest
2 голосов
/ 04 июня 2009

Я использую MySQL с модулем MySQLdb в Python, в Django.

В этом случае я работаю в режиме автоматической фиксации (а транзакция Django.is_managed () фактически возвращает False).

У меня есть несколько процессов, взаимодействующих с базой данных.

Один процесс извлекает все модели задач с помощью Task.objects.all ()

Затем другой процесс добавляет модель Task (я вижу ее в приложении для управления базами данных).

Если я вызываю Task.objects.all () в первом процессе, я ничего не вижу. Но если я вызываю connection._commit (), а затем Task.objects.all (), я вижу новую задачу.

У меня вопрос: есть ли какое-либо кэширование на уровне соединения? И это нормальное поведение (мне это не кажется)?

1 Ответ

1 голос
/ 04 июня 2009

Это, безусловно, связано с автоматической фиксацией / блокировкой таблицы.

Если mysqldb реализует спецификацию dbapi2, вероятно, соединение будет работать как одна непрерывная транзакция. Когда вы говорите: 'running in autocommit mode': вы имеете в виду сам MySQL или модуль mysqldb? Или Джанго?

Непостоянная передача прекрасно объясняет поведение, которое вы получаете:

i) соединение, реализованное как одна отдельная транзакция в mysqldb (по умолчанию, вероятно)

ii) не открывать / закрывать соединения только при необходимости, но (повторно) использовать одно (или несколько) постоянных соединений с базой данных (я думаю, это может быть унаследовано от Django-архитектуры).

ii) ваш выбор («чтение») вызывает «простую блокировку чтения» для таблицы (что означает, что другие соединения все еще могут «читать» эту таблицу, но соединения, желающие «записать данные», могут » t (немедленно), потому что эта блокировка не позволяет им получить «эксклюзивную блокировку» (необходимую «для записи») для этой таблицы, поэтому запись откладывается на неопределенное время (до тех пор, пока она не сможет получить (короткую) эксклюзивную блокировку для таблицы для записи - когда вы закрываете соединение или фиксируете вручную).

Я бы сделал следующее в вашем случае:

  • выясните, какие блокировки таблиц в вашей базе данных во время сценария выше
  • читайте о Django и транзакциях здесь . Краткий обзор предлагает использовать стандартную функциональность Django, что неявно вызывает коммиты. Это означает, что отправка SQL вручную может быть невозможна (вставить, обновить ...).
...