Транзакции на сессию в Django

Вы также можете использовать chmod 777 *

Это даст разрешения всем файлам, находящимся в данный момент в папке, и файлам, добавленным в будущем, без предоставления разрешений для самого каталога.

ПРИМЕЧАНИЕ. Это следует делать в папке, в которой находятся файлы. Для меня это была проблема с изображениями, поэтому я пошел в папку с изображениями и сделал это.

8
задан Alice Purcell 23 June 2009 в 17:39
поделиться

3 ответа

Множественные параллельные транзакции в масштабе сеанса обычно приводят к тупикам или хуже (хуже == livelock, длительные задержки, пока блокировки удерживаются другим сеансом.)

Такой дизайн - не лучшая политика, поэтому Django не одобряет его.

Лучшее решение - следующее.

  1. Создайте Memento класс, который записывает изменение пользователя. Это может быть сохраненная копия их ввода формы. Вам может потребоваться записать дополнительную информацию, если изменения состояния сложные. В противном случае может быть достаточно копии ввода формы.

  2. Накопить последовательность объектов Memento в их сеансе. Обратите внимание, что каждый шаг в транзакции будет включать выборку данных и проверку, чтобы увидеть, будет ли цепочка сувениров «работать». Иногда они не работают, потому что кто-то что-то изменил в этой цепочке сувениров. Что теперь?

  3. Когда вы представляете «готов к совершению?» страницы, вы воспроизвели последовательность Mementos и почти уверены, что они сработают. При отправке «Commit» вы должны воспроизвести Mementos в последний раз, надеясь, что они все еще будут работать. Если они это сделают, отлично. Если нет, значит, кто-то что-то изменил, и вы снова на шаге 2: что теперь?

Это кажется сложным.

Да, это так. Однако он не удерживает никаких блокировок, что обеспечивает невероятную скорость и небольшую возможность зайти в тупик. Транзакция ограничена «фиксацией»

8
ответ дан 5 December 2019 в 14:06
поделиться

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

У меня есть объект «пользователь», который сохраняется в течение сеанса пользователя и содержит объект постоянного соединения. Когда я проверяю, что конкретное HTTP-взаимодействие является частью сеанса, я также сохраняю объект пользователя в django.db.connection, который является локальным для потока.

2
ответ дан 5 December 2019 в 14:06
поделиться

Я придумал что-то похожее на шаблон Memento, но достаточно другое, чтобы его можно было опубликовать. Когда пользователь запускает сеанс редактирования, я дублирую целевой объект во временный объект в базе данных. Все последующие операции редактирования влияют на дубликат. Вместо сохранения состояния объекта в памятке при каждом изменении, я сохраняю объекты операции . Когда я применяю операцию к объекту, он возвращает обратную операцию, которую я сохраняю.

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

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

Чтобы реализовать «сохранение изменений», то есть фиксацию, я деактивирую и ставлю метку времени на исходный объект и активирую временный на его месте.

Для реализации «отмены», т.е. отката, я ничего не делаю! Конечно, я мог бы удалить временное, потому что у пользователя нет возможности получить его после завершения сеанса редактирования,

2
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: