django是否在第一次查询时创建隐式事务? [英] Does django create implicit transaction on first query?

查看:194
本文介绍了django是否在第一次查询时创建隐式事务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有django 1.3.1,python2.6和MySQL 5.5.20。 set.py中的
init_command 设置为 SET storage_engine = INNODB



我有以下情况:



考虑模型:

 name = models.CharField(max_length = 50)

def __unicode __(self):
返回自身。名字

现在我打开两个Django shell并输入:



django shell I:

  ./ manage.py shell 
InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit(name =apple)。save()
>>> m.Fruit.objects.get(pk = 1)
< Fruit:apple>

django shell II:

  ./ manage.py shell 
(InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit.objects.get(pk = 1)
< Fruit:apple>

到目前为止这么好。现在我继续输入 shell我

 >>> m.Fruit(name =peach)。save()
>>> m.Fruit.objects.get(pk = 2)
< Fruit:peach>消息:为什么在 中键入以下内容:

shell II 找不到该对象?

 >> ;> m.Fruit.objects.get(pk = 2)
追溯(最近的最后一次呼叫):
文件< console>,第1行,< module>
文件.... / django / db / models / manager.py,第132行,get
return self.get_query_set()。get(* args,** kwargs)
文件.... / django / db / models / query.py,第349行,get
%self.model._meta.object_name)
DoesNotExist:水果匹配查询不存在。

我发现使shell II具有全新外观的唯一方法是:

 >>> from django.db import transaction 
>>>> transaction.enter_transaction_management()
>>> transaction.rollback()

我需要 roolback()每次我查询水果,如果我想确定orm不会说谎。

解决方案

是一个发行问题。您可以放松到提交的隔离级别,以避免此行为。此外,请了解此次发行级别的影响(幻影)。



要将您的django项目的Read Commited Isolation Level设置为MySQL,您应该在settings.py中设置此参数:

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


I have django 1.3.1, python2.6 and MySQL 5.5.20. init_command in setting.py is set to SET storage_engine=INNODB.

I have the following situation:

Consider the model:

class Fruit(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

Now I open two Django shells and type:

django shell I:

./manage.py shell
(InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit(name="apple").save()
>>> m.Fruit.objects.get(pk=1)    
<Fruit: apple>

django shell II:

./manage.py shell
(InteractiveConsole)
>>> import fruits.models as m
>>> m.Fruit.objects.get(pk=1)    
<Fruit: apple>

So far so good. Now I continue to type in shell I:

>>> m.Fruit(name="peach").save()
>>> m.Fruit.objects.get(pk=2)
<Fruit: peach>

Qestion: Why typing the following in the shell II does not find the object?

>>> m.Fruit.objects.get(pk=2)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "..../django/db/models/manager.py", line 132, in get
    return self.get_query_set().get(*args, **kwargs)
  File "..../django/db/models/query.py", line 349, in get
    % self.model._meta.object_name)
DoesNotExist: Fruit matching query does not exist.

The only way I've found to make shell II to have "a fresh look" is this:

>>> from django.db import transaction
>>> transaction.enter_transaction_management()
>>> transaction.rollback()

And I need to roolback() each time I query for fruits if I want to be sure that orm will not "lie".

解决方案

This is a issolation issue. You can relax to 'isolation level read commited' to avoid this behavior. Also, learn about this issolation level implications (phantoms).

To set Read Commited Isolation Level into MySQL for your django project you should set this parameter in settings.py:

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

这篇关于django是否在第一次查询时创建隐式事务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆