Ответ не за горами, в документации для select_for_update (выделено мной):
Оценка набора запросов с помощью select_for_update в режиме автоматической фиксации является ошибкой, поскольку в этом случае строки не блокируются. Если это разрешено, это упростит повреждение данных и может быть легко вызвано вызовом вне какой-либо транзакции кода, который должен выполняться в одной транзакции.
Другими словами, существует противоречивое поведение между autocommit
и select_for_update
, что может привести к повреждению данных. Вот обсуждение разработчиков django, где они впервые предложили решить эту проблему, процитирую (опять же, выделение мое):
[...] в Oracle в режиме автоматической фиксации автоматическая фиксация происходит сразу после выполнения команды, поэтому попытка получить результаты не удалась, поскольку выполняется в отдельной транзакции.
Однако с любым бэкэндом выбор для обновления в режиме автоматической фиксации не имеет большого смысла. Даже если он не ломается (как это происходит в Oracle), на самом деле он ничего не блокирует. Итак, IMO, выполнение запроса, который является выбором для обновления в режиме автоматической фиксации, вероятно, является ошибкой, и тот, который может вызвать ошибки, связанные с повреждением данных.
Поэтому я предлагаю изменить поведение запросов выбора для обновления, чтобы исключить ошибки [...] Это обратно несовместимое изменение [...] Эти проекты, вероятно, должны быть благодарны - они работали с тонкая ошибка, которая теперь выявляется, но все же.
Так что это была ошибка только для Oracle, которая пролила свет на более глубокую проблему, актуальную для всех серверных частей, и поэтому они приняли решение сделать это ошибкой в django.
Atomic
, с другой стороны, фиксирует данные в базе данных только после проверки отсутствия ошибок, тем самым решая проблему.
person
yuvi
schedule
11.05.2014