Настройка уровня изоляции транзакции Django / postgres игнорируется - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема с настройкой уровня изоляции транзакции.Я хочу самый строгий сериализуемый, в то время как по умолчанию чтение зафиксировано.

Я использую:

Django==1.10.6
psycopg2==2.5.1

Запуск на герою.

На основании документации: https://docs.djangoproject.com/en/1.10/ref/databases/#isolation-level

У меня есть следующие settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'OPTIONS': {
        'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
    }
}

if on_heroku:
    DATABASES['default'] = dj_database_url.config()

Вот код вида:

@require_http_methods(["POST"])
@transaction.atomic
@login_required()
def api_test_add_one(request):
    cursor = connection.cursor()

    cursor.execute('SHOW default_transaction_isolation')

    logger.info("aa: " + str(cursor.fetchone()))

    return HttpResponse("{}", content_type="application/json")

Вывод:

aa: (u'read committed',)

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

1 Ответ

0 голосов
/ 30 мая 2018

ОПЦИИ принадлежат внутри настроек базы данных, например,

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgres',
        ...
        'OPTIONS': {
            'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
        },
    },
}

В вашем случае вы замените DATABASES['default'], поэтому ваш набор OPTIONS будет потерян:

if on_heroku:
    DATABASES['default'] = dj_database_url.config()

Вместо этого вы можете установить OPTIONS после настройки DATABASES['default'].

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

if on_heroku:
    DATABASES['default'] = dj_database_url.config()
    DATABASES['default']['OPTIONS'] = {
        'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...