1

私はdjango 1.3.1、python2.6、およびMySQL 5.5.20を持っています。 init_commandsetting.py で に設定されていSET storage_engine=INNODBます。

次のような状況があります。

モデルを考えてみましょう:

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

    def __unicode__(self):
        return self.name

ここで、2 つの Django シェルを開き、次のように入力します。

ジャンゴシェルI:

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

ジャンゴシェル II:

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

ここまでは順調ですね。次に、シェル Iを入力し続けます。

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

Qestion: シェル II で次のように入力してもオブジェクトが見つからないのはなぜですか?

>>> 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.

シェル II を「新鮮な外観」にする唯一の方法は次のとおりです。

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

そしてroolback()、orm が「嘘をつかない」ことを確認したい場合は、毎回果物を照会する必要があります。

4

1 に答える 1

2

これは分離の問題です。この動作を回避するには、「分離レベル読み取りコミット」に緩和できます。また、この分離レベルの影響 (ファントム) についても学びます。

django プロジェクトで Read Commited Isolation Level を MySQL に設定するには、settings.py でこのパラメーターを設定する必要があります。

DATABASE_OPTIONS = { 
     "init_command": 'SET storage_engine=INNODB,    \
                      SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', }
于 2012-08-27T21:06:17.257 に答える