2012-08-27 34 views
1

我有django 1.3.1,python2.6和MySQL 5.5.20。在settings.py中的 init_command設置爲SET storage_engine=INNODBdjango是否在第一個查詢中創建隱式事務?

我有以下情況:

考慮模型:

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

    def __unicode__(self): 
     return self.name 

現在我打開兩個Django的炮彈和類型:

Django的殼我:

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

d詹殼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不會「撒謊」。

+0

你可以放鬆隔離級別讀COMMITED:http://stackoverflow.com/questions/2280779/django-transaction-isolation-level-in-mysql-postgresql(請參閱Peter Lundberg答案) – danihp

+0

但是「桃子」已經提交。如果我退出shell 2並再次運行它,我會看到它 –

+0

@danihp,是的,你其實是對的。這是MySQL問題和django的問題。請寫下這個答案,我會接受它。謝謝。 –

回答

2

這是一個隔離問題。你可以放鬆'隔離級讀取提交'以避免這種行爲。另外,瞭解這種日照程度的影響(phantoms)。

要設置閱讀COMMITED隔離級別到MySQL的Django項目,應設置此參數settings.py:

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

需要注意的是,可以使用以下命令來檢查當前的MySQL隔離級別:'select @@ session.tx_isolation;' –

+0

您可以舉一個「併發異常」的例子嗎? –

+0

當兩個用戶同時嘗試更改數據庫中的相同數據時,會引發併發異常。比這更復雜:每個隔離級別具有不同的規則,一個事務可以處理多個數據更改等。 – danihp

相關問題