У меня есть веб-приложение на основе Django, использующее PostgreSQL в качестве бэкэнда через psycopg2. Сейчас мы находимся на postgres 8.4.x, но в будущем перейдем на 9.1.x. Мы используем текущую стабильную версию Django (1.3.1).
Я хочу включить более строгую изоляцию транзакций (согласно postgres docs ) на уровнях REPEATABLE READ или SERIALIZABLE. Из источника psycopg2 доступны:
"""Isolation level values."""
ISOLATION_LEVEL_AUTOCOMMIT = 0
ISOLATION_LEVEL_READ_UNCOMMITTED = 1
ISOLATION_LEVEL_READ_COMMITTED = 2
ISOLATION_LEVEL_REPEATABLE_READ = 3
ISOLATION_LEVEL_SERIALIZABLE = 4
К сожалению, бэкэнд-реализация Django 1.3.1 в _set_isolation_level()
для бэкэнда включает в себя assert level in (0, 1)
, что, по-видимому, не позволяет использовать этот метод, чтобы установить уровень изоляции настолько высоким, насколько я хочу прямо сейчас.
В недавнем коммите в ствол Джанго, приятно видеть, что это ограничение было ослаблено, чтобы разрешить уровни до 4, однако, по-прежнему нет возможности выбора через обычные настройки Джанго чтобы фактически указать бэкэнду, что вы хотите более высокий уровень изоляции, чем ISOLATION_LEVEL_READ_COMMITTED. Другими словами, в то время как _set_isolation_level()
теперь будет принимать уровень до 4, нет никакого способа, основанного на конфигурации, чтобы фактически вызвать его с 4 в качестве аргумента.
Вопросы:
Предполагая, что я готов начать использовать версию Django devel, чтобы получить это изменение, каков будет правильный / рекомендуемый способ вызова _set_isolation_level()
вручную, поскольку нет параметра конфигурации, который приведет к тому, что он будет вызываться с уровень изоляции я хочу?
Если я не желаю использовать версию Django devel, каков рекомендуемый способ передачи желаемого уровня изоляции в psycopg2 с использованием Django 1.3.1?
Трудно ли указывать эти более высокие уровни изоляции как в текущих, так и в будущих версиях Django, поскольку на практике они вызывают огромные проблемы? (то есть я должен делать это вообще?) Имейте в виду, что наше приложение имеет относительно низкую пропускную способность БД с большими, нечастыми транзакциями с чрезвычайно высоким желанием согласованности.
Заранее спасибо за любые предложения.