【问题标题】:Django/postgres transaction isolation level setting ignoredDjango/postgres 事务隔离级别设置被忽略
【发布时间】:2018-05-31 04:24:31
【问题描述】:

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

我正在使用:

Django==1.10.6
psycopg2==2.5.1

在 Heroku 上运行。

根据文档: 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',)

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

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

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

    【讨论】:

    • 就是这样,我希望我早点问!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多