Принудительное принятие вложенного save () в транзакции - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть функция, в которой я сохраняю большое количество моделей (тысяч за раз), это занимает несколько минут, поэтому я написал индикатор выполнения, чтобы отобразить прогресс для пользователя. Индикатор выполнения работает путем опроса URL-адреса (из Javascript) и поиска значения request.session, чтобы увидеть состояние первого вызова (который сохраняет).

Проблема в том, что первый вызов находится в декораторе @action.commit_on_success, и потому что я использую сеансы с поддержкой базы данных, когда пытаюсь принудительно вызвать request.session.save () вместо его немедленной фиксации, он добавляется к текущей транзакции , Это приводит к тому, что индикатор выполнения обновляется только после завершения всех сохранений, что делает его бесполезным.

Мой вопрос (и я на 99,99% уверен, что я уже знаю ответ), можете ли вы зафиксировать операторы внутри транзакции, не выполняя всю работу. то есть мне нужно просто зафиксировать request.session.save (), оставив все остальные ..

Большое спасибо, Алекс

1 Ответ

1 голос
/ 19 сентября 2011

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

Я вижу два варианта, чтобы избежать этого.

  1. Вы можете создать свое собственное отдельное соединение с базой данных и сохранить обновления строки состояния, используя это.

  2. Не сохраняйте обновления строки состояния в базе данных, а вместо этого используйте кеш для их хранения. Пока вы не используете серверную часть кэша базы данных (в идеале вы должны использовать memcached), это будет работать нормально.

Мой предпочтительный вариант - второй. Вам нужно будет углубиться во внутренности Django, чтобы получить собственное соединение с базой данных, так что оно может оказаться хрупким и грязным.

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