我在设置事务隔离级别时遇到问题。我想要最严格的可序列化,而默认是读提交。
我在用:
Django==1.10.6
psycopg2==2.5.1
Run Code Online (Sandbox Code Playgroud)
在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()
Run Code Online (Sandbox Code Playgroud)
这是视图代码:
@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")
Run Code Online (Sandbox Code Playgroud)
输出是:
aa: (u'read committed',)
Run Code Online (Sandbox Code Playgroud)
我在访问同一个端点时同时运行了不同的测试,在数据库中增加了一个整数,并确认事务没有被隔离。
选项属于内部数据库的设置,例如,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgres',
...
'OPTIONS': {
'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
},
},
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您替换了DATABASES['default'],因此您的OPTIONS设置将丢失:
if on_heroku:
DATABASES['default'] = dj_database_url.config()
Run Code Online (Sandbox Code Playgroud)
相反,您可以在设置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,
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |