Какие методы должны быть переопределены для реализации автоматической блокировки и разблокировки записей в Django - PullRequest
2 голосов
/ 04 февраля 2011

Как я могу изменить поведение моделей в Django для выполнения автоматической блокировки и разблокировки записей в базе данных при их выборе и сделать это поведение прозрачным для программиста? Я уже знаю, как заблокировать и разблокировать запись ( блокировка записи в базе данных ), но мы хотели бы знать, где этот код должен быть размещен в моделях Django. Я бы хотел, чтобы он работал для каждого запроса all (), filter (), exclude () и других, а разблокировка должна вызываться при сохранении (), а также в запросах, в которых мы ничего не сохраняем.

ОБНОВЛЕНИЕ : это приложение имеет несколько потоков, которые могут запускаться двумя или более серверами одновременно, и я хочу убедиться, что никакие записи из общей базы данных не будут обработаны более чем одним потоком. Потоки ищут некоторые записи, а затем отправляют некоторые данные через сокеты и, наконец, обновляют эти записи. Другими словами, помимо сайта Django есть серверы.

1 Ответ

2 голосов
/ 05 февраля 2011

Вы захотите получить блокировку во время модели __init__();это может быть реализовано довольно просто через наследование.Для модели Manager будет создан экземпляр QuerySet для этой модели, и ваша блокировка будет получена, как только извлеченная модель будет добавлена ​​в запрос _result_cache[] или когда будет вызван запрос iterator().Конечно, вы должны будете убедиться, что, если модель еще не имеет ассоциированного pk, вы отказываетесь от конфликта блокировки.

Если вы не хотите делать блокировку на уровне DB,Вы можете посмотреть на Django-cachebot .Он обрабатывает аннулирование модели, но самое главное, что он может хранить записи модели в общем хранилище для ваших потоков, поэтому вы можете реализовать состояние блокировки модели и отправить его в хранилище и запросить другие потоки.

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

...