2013-11-17 5 views
4

У меня есть программа python, которая использует ORM django для доступа к db. Программа имеет различные потоки, каждый из которых может потенциально получить доступ к db с чтением или записью. Обратите внимание, что эта программа не является веб-сервером.Безопасна ли ORM нить django?

Является ли поток ОРМ django безопасным?
Может ли он использоваться параллельно из разных потоков в одном и том же интерпретаторе?
Ответ зависит от режима управления транзакциями? версия django? что-нибудь еще?

+0

Из того, что я понимаю, безопасность потока [обеспечена] (https://github.com/django/django/blob/1.5.5/django/db/backends/__init__.py#L141), используя транзакции, которые начиная с версии 1.6, включен [по умолчанию] (https://docs.djangoproject.com/en/dev/topics/db/transactions/#django-s-default-transaction-behavior). Таким образом, в django <1,6 это происходит только тогда, когда вы применяете транзакции вручную. – mariodev

+0

Вероятно, это будет зависеть от вашего драйвера базы данных. Я бы рискнул, что большинство из них * не * потокобезопасны. –

+0

Мне невероятно, что такой базовый вопрос не имеет четкого и хорошо документированного ответа. – Jonathan

ответ

1

Да,

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

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

Я рекомендую вам всегда проверять, что ваш код вернет новый объект QuerySet и не отправит запросы в качестве аргументов в функции, и вы будете в порядке.

+0

Почему отключить настройку автоматической фиксации по умолчанию? когда я должен выполнять запросы? – Dejell

Смежные вопросы