【发布时间】:2010-02-17 13:03:33
【问题描述】:
你知道 Django 中使用的事务的默认隔离级别吗? 是否可以以独立于数据库的方式设置隔离级别?
我主要对 mysql 和 postgres 感兴趣。
【问题讨论】:
标签: django-models isolation-level
你知道 Django 中使用的事务的默认隔离级别吗? 是否可以以独立于数据库的方式设置隔离级别?
我主要对 mysql 和 postgres 感兴趣。
【问题讨论】:
标签: django-models isolation-level
您也可以使用 django 数据库选项更改每个客户端/会话,如下所示:
DATABASE_OPTIONS = { "init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", }
【讨论】:
SET storage_engine=INNODB; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
mysql 驱动程序不会更改隔离级别,因此它取决于服务器的默认隔离级别。
【讨论】:
目前 django 没有设置隔离级别。这是一个错误,因为 django 在任何高于 READ COMMITTED 的隔离级别下都无法正常工作。但是 MySQL 默认使用 REPEATABLE READ。有计划添加一个设置来设置隔离级别 (#14026) 以及关于将 READ COMMITTED 设为默认值的讨论 (#13906)。我还写了一篇关于MySQL transactions and django的详细文章。
【讨论】:
(对不起,我不能评论 Danhip) 这个解决方案适合我(mySQL),我在 DATABASE 字段中添加了 Peter 的代码:
DATABASES = {
'default': {
(...)
'OPTIONS': {
(...),
"init_command": "SET storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"
},
}
}
【讨论】:
如果你想使用读取未提交的隔离级别。
您在 'OPTIONS on database connection configuration' 中添加 'isolation_level': 'read uncommitted'。
DATABASES = {
'read-uncommited': {
'OPTIONS': {
'isolation_level': 'read uncommitted'
},
},
}
【讨论】: