mysql和postgresql中的Django事务隔离级别

cyvaqqii  于 2022-12-14  发布在  Go
关注(0)|答案(6)|浏览(199)

你知道Django中事务的默认隔离级别吗?是否可以独立于数据库来设置隔离级别?
我主要对mysql和postgres感兴趣。

kcwpcxri

kcwpcxri1#

您也可以使用django数据库选项来更改每个客户端/会话的设置,如下所示:

DATABASE_OPTIONS = { "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", }
vq8itlhq

vq8itlhq2#

隔离级别不会被mysql驱动程序更改,因此它取决于服务器的默认隔离级别。

4uqofj5v

4uqofj5v3#

目前django没有设置隔离级别,这是一个bug,因为django不能在高于READ COMMITTED的隔离级别下正常工作。但是MySQL默认使用REPEATABLE READ。有计划添加一个设置来设置隔离级别(#14026)和关于将READ COMMITTED设置为默认值(#13906)的讨论。我还写了一篇关于MySQL transactions and django的详细文章。

s3fp2yjn

s3fp2yjn4#

我尝试了文档Windows 11上的Django 3.2.16settings.py中所解释的内容,如下所示,但它没有将隔离级别从**READ COMMITTED更改为SERIALIZABLE。* 我还询问了SO**上的a similar questionthe similar question还解释了如何测试隔离级别是否更改:

# "settings.py"

import psycopg2.extensions

DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.postgresql',
        'NAME':'postgres',
        'USER':'postgres',
        'PASSWORD':'admin',
        'HOST':'localhost',
        'PORT':'5432',
    },
    'OPTIONS': { # ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓   Here   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
        'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
    },
}

因此,我直接使用psql设置**SERIALIZABLE,如下所示,最后,我可以将隔离级别从READ COMMITTED更改为SERIALIZABLE**:

postgres=# ALTER DATABASE postgres SET DEFAULT_TRANSACTION_ISOLATION TO 'SERIALIZABLE';

所以,只要我研究,似乎Django有一些bug。这就是为什么文档解释的东西不起作用。

z6psavjg

z6psavjg5#

(对不起,我不能为Danhip评论)这个解决方案适合我(mySQL),我添加了Peter的代码在数据库字段:

DATABASES = {
    'default': {
        (...)
        'OPTIONS': {
            (...),
            "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"
        },
     }
}
inb24sb2

inb24sb26#

如果您想使用读取未提交隔离级别。
添加“隔离级别”:数据库连接配置上的“OPTIONS”中的“read uncommitted”。

DATABASES = {
    'read-uncommited': {
        'OPTIONS': {
            'isolation_level': 'read uncommitted'
        },
    },
}

可以从https://docs.djangoproject.com/en/2.1/ref/databases/中找到

相关问题