你知道Django中事务的默认隔离级别吗?是否可以独立于数据库来设置隔离级别?我主要对mysql和postgres感兴趣。
kcwpcxri1#
您也可以使用django数据库选项来更改每个客户端/会话的设置,如下所示:
DATABASE_OPTIONS = { "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", }
vq8itlhq2#
隔离级别不会被mysql驱动程序更改,因此它取决于服务器的默认隔离级别。
4uqofj5v3#
目前django没有设置隔离级别,这是一个bug,因为django不能在高于READ COMMITTED的隔离级别下正常工作。但是MySQL默认使用REPEATABLE READ。有计划添加一个设置来设置隔离级别(#14026)和关于将READ COMMITTED设置为默认值(#13906)的讨论。我还写了一篇关于MySQL transactions and django的详细文章。
s3fp2yjn4#
我尝试了文档在Windows 11上的Django 3.2.16中settings.py中所解释的内容,如下所示,但它没有将隔离级别从**READ COMMITTED更改为SERIALIZABLE。* 我还询问了SO**上的a similar question,the similar question还解释了如何测试隔离级别是否更改:
settings.py
READ COMMITTED
SERIALIZABLE
# "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。这就是为什么文档解释的东西不起作用。
z6psavjg5#
(对不起,我不能为Danhip评论)这个解决方案适合我(mySQL),我添加了Peter的代码在数据库字段:
DATABASES = { 'default': { (...) 'OPTIONS': { (...), "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED" }, } }
inb24sb26#
如果您想使用读取未提交隔离级别。添加“隔离级别”:数据库连接配置上的“OPTIONS”中的“read uncommitted”。
DATABASES = { 'read-uncommited': { 'OPTIONS': { 'isolation_level': 'read uncommitted' }, }, }
可以从https://docs.djangoproject.com/en/2.1/ref/databases/中找到
6条答案
按热度按时间kcwpcxri1#
您也可以使用django数据库选项来更改每个客户端/会话的设置,如下所示:
vq8itlhq2#
隔离级别不会被mysql驱动程序更改,因此它取决于服务器的默认隔离级别。
4uqofj5v3#
目前django没有设置隔离级别,这是一个bug,因为django不能在高于READ COMMITTED的隔离级别下正常工作。但是MySQL默认使用REPEATABLE READ。有计划添加一个设置来设置隔离级别(#14026)和关于将READ COMMITTED设置为默认值(#13906)的讨论。我还写了一篇关于MySQL transactions and django的详细文章。
s3fp2yjn4#
我尝试了文档在Windows 11上的Django 3.2.16中
settings.py
中所解释的内容,如下所示,但它没有将隔离级别从**READ COMMITTED
更改为SERIALIZABLE
。* 我还询问了SO**上的a similar question,the similar question还解释了如何测试隔离级别是否更改:因此,我直接使用psql设置**
SERIALIZABLE
,如下所示,最后,我可以将隔离级别从READ COMMITTED
更改为SERIALIZABLE
**:所以,只要我研究,似乎Django有一些bug。这就是为什么文档解释的东西不起作用。
z6psavjg5#
(对不起,我不能为Danhip评论)这个解决方案适合我(mySQL),我添加了Peter的代码在数据库字段:
inb24sb26#
如果您想使用读取未提交隔离级别。
添加“隔离级别”:数据库连接配置上的“OPTIONS”中的“read uncommitted”。
可以从https://docs.djangoproject.com/en/2.1/ref/databases/中找到