У меня есть функция, которая выполняет несколько запросов в одном наборе данных, и я хочу, чтобы все запросы отображали точно такие же данные.В Django, как добиться повторяемости чтения для транзакции?
С точки зрения SQL это означает, что уровень изоляции REPEATABLE READ для баз данных, которые его поддерживают. Я не против иметь более высокий уровень или даже полную блокировку, если база данных не способна.
Насколько я вижу, это не тот случай. То есть если я бегу что-то вроде этого кода в одной оболочке Python:
with transaction.atomic():
for t in range(0, 60):
print("{0}: {1}".format(t, MyModel.objects.count()))
time.sleep(1)
Как только я MyModel.objects.create(...)
в другой, значение, обнаруженное за счет увеличения контура проточной немедленно. Именно этого я и хочу избежать. Дальнейшие тесты показывают, что поведение соответствует уровню READ COMMITTED, который слишком слаб для моих вкусов.
Я также хочу подчеркнуть, что я хочу более строгого уровня изоляции только для одной функции, а не для всего проекта.
Каковы мои лучшие варианты для достижения этой цели?
В моем конкретном случае единственной базой данных, о которой я забочусь, является PostgreSQL 9.3+, но мне также нужна некоторая совместимость с SQLite3, и в этом случае даже полная блокировка всей базы данных в порядке со мной. Но, очевидно, чем более общим является решение, тем более предпочтительным оно является.
кэширование этих метаданных является приемлемым подходом? –
К сожалению, нет. Запросы, которые я вычисляю по разным статистическим данным по необработанным данным событий, и иметь согласованный вид, мне придется вытащить весь набор данных в памяти, чего я действительно не хочу делать. – drdaeman