2010-02-17 240 views

回答

3

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

1

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

+1

谢谢,但是您链接的博客似乎是私人的。你可以打开那篇文章,或复制/粘贴这里吗? – Evgeny 2013-06-14 20:31:05

+2

你可以引用一些信息或详细说明“django不能正常工作,且隔离级别高于READ COMMITTED”。 – Evgeny 2013-06-14 20:36:33

+0

@Sebastian Noack文章说'需要许可'? – 2013-08-22 06:19:16

9

您也可以使用Django的数据库选项,这样的改变这个每个客户端/会话:

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

有人可以证实这个运行?我有可重复阅读的问题:http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django – danihp 2012-03-20 17:45:37

+0

@danihp肯定运行,虽然语法是关闭的。我正在使用'SET storage_engine = INNODB; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;'改为 – soulseekah 2016-01-12 05:41:21

0

(对不起,我不能评论Danhip) 该解决方案wotked我(MySQL的),我在DATABASE字段中添加了Peter的代码:

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