Django/postgres 事务隔离级别设置被忽略

标签 django postgresql

我在设置事务隔离级别时遇到问题。我想要最严格的可序列化,而默认是读取提交。

我正在使用:

Django==1.10.6
psycopg2==2.5.1

在 heroku 上运行。

根据文档: https://docs.djangoproject.com/en/1.10/ref/databases/#isolation-level

我有以下设置.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',)

我运行了不同的测试,同时访问同一个端点,在数据库中递增一个整数,并确认事务没有被隔离。

最佳答案

OPTIONS 属于内部数据库的设置,例如

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()

相反,您可以在设置 DATABASES['default'] 之后设置 OPTIONS

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,
    }

关于Django/postgres 事务隔离级别设置被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608734/

相关文章:

postgresql - 遍历查询结果与遍历 Postgres 中显式声明的游标

python - 如何让django QuerySet会动态过滤?

django - 尽管调用正常,但测试 Django Rest Framework POST 返回 500

django - 如何覆盖 Django Rest Framework 中 token 模型的用户字段?

ruby-on-rails - 提高 ActiveRecord 查询的性能

postgresql - 如何在 pgadmin 4 中重命名当前数据库?

python - Celery Worker 数据库连接池

Django - 修改 session 数据时 session cookie过期时间是否更新?

python - Django 与 Apache : Global variable in view. py

python - 如何使用 sqlalchemy 将带有 datetime.timedelta 类型数据对象的 pandas 数据框存储到 postgresql d/b 中?