Конфигурирование изоляции REPEATABLE READ или SERIALIZED для Django на PostgreSQL - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть веб-приложение на основе 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, поскольку на практике они вызывают огромные проблемы? (то есть я должен делать это вообще?) Имейте в виду, что наше приложение имеет относительно низкую пропускную способность БД с большими, нечастыми транзакциями с чрезвычайно высоким желанием согласованности.

Заранее спасибо за любые предложения.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Самый простой и совместимый способ сделать это - написать свой собственный адаптер БД, который наследует от django по умолчанию и переопределяет методы, так что вы можете установить собственный уровень изоляции.

1 голос
/ 28 ноября 2011

Это кажется странным.AUTOCOMMIT не является уровнем изоляции транзакции.READ COMMITTED - это стандарт по умолчанию в PostgreSQL, и вы получите поведение READ COMMITTED с 1 или 2.

Я думаю, вы ищете set_session ([изоляционный_уровень,] [только для чтения,] [отложенный,][autocommit]) .

Сложно ли указывать эти более высокие уровни изоляции в текущих и будущих версиях Django, поскольку на практике они вызывают огромные проблемы?

Насколько я могу судить, проблемы больше связаны с MySQL и обратной совместимостью, чем с PostgreSQL.MySQL по умолчанию имеет значение REPEATABLE READ;некоторые разработчики Django считают, что поведение READ COMMITTED проверено не так тщательно, как следовало бы.

https://code.djangoproject.com/ticket/13906

...