Несколько процессов, обращающихся к Django db backend; записи не отображаются, пока не будет вызван _commit вручную - PullRequest
5 голосов
/ 10 июля 2009

У меня есть проект Django, в котором несколько процессов обращаются к бэкэнду mysql db. Один процесс создает записи, в то время как второй процесс пытается прочитать эти записи. У меня проблема, когда второй процесс, который пытается прочитать записи, не может найти записи, пока я не вызову connection._commit () вручную.

Этот вопрос задавался ранее: проблемы с кэшированием в ответе MySQL с MySQLdb в Django

ОП заявил, что решил проблему, но не совсем объяснил, как. Может кто-нибудь пролить некоторый свет на это? Я хотел бы иметь возможность доступа к записям без ручного вызова _commit ().

Спасибо

Асиф

Ответы [ 2 ]

5 голосов
/ 10 июля 2009

Он сказал:

Автокоммит Django не является автокоммитом в БД.

Итак, вы должны убедиться, что автокоммит установлен на уровне БД. В противном случае из-за изоляции транзакции процессы не будут видеть изменения, сделанные другим процессом (другим соединением), пока не будет выполнена фиксация. На самом деле, это не проблема Django, за исключением отсутствия ясности в документах об автоматической фиксации Django! = Db autocommit.

Обновление: Немного перефразируя из документов MySQL:

REPEATABLE READ является значением по умолчанию уровень изоляции для InnoDB. За последовательное чтение, есть важное отличие от READ СОВЕРШЕННЫЙ уровень изоляции: Все последовательное чтение в том же транзакция читать снимок установлено первым чтением . (Мои акцент.)

Таким образом, с REPEATABLE READ вы получаете только при последующих чтениях то, что было прочитано при первом чтении. При READ COMMITTED каждое чтение создает и считывает свой собственный свежий снимок, чтобы вы могли видеть последующие обновления из других транзакций. Так что, отвечая на ваш комментарий, вы изменили уровень транзакции.

0 голосов
/ 10 июля 2009

Запускаете ли вы процессы как представления? Если это так, они, вероятно, фиксируют, когда запрос завершает обработку, но похоже, что вы запускаете эти процессы одновременно. Если вы запускаете процесс вне представления, они должны фиксироваться при каждом сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...