2012-08-27 4 views
1

나는 장고 1.3.1, 파이썬 2.6과 MySQL 5.5.20을 가지고있다. 설정 도구의 init_commandSET storage_engine=INNODB으로 설정됩니다.django가 첫 번째 쿼리에서 암시 적 트랜잭션을 생성합니까?

나는 다음과 같은 상황이 :

장고 쉘 I :

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

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

    def __unicode__(self): 
     return self.name 

내가이 장고 셸을 열고 다음을 입력

모델을 고려

d jango shell II :

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

지금까지 그렇게 좋았습니다.

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

당신은 최선을 다하고 읽기 분리 레벨을 휴식을 취할 수 있습니다 : http://stackoverflow.com/questions

는 settings.py에서이 매개 변수를 설정해야합니다 귀하의 장고 프로젝트에 대한 MySQL의에 읽기 최선을 다하고 격리 수준을 설정하려면/2280779/django-transaction-isolation-level-in-mysql-postgresql (Peter Lundberg의 답변 참조) – danihp

+0

그러나 "peach"는 커밋됩니다. 쉘 2를 종료하고 다시 실행하면 –

+0

@danihp가 표시됩니다. 그렇습니다. 실제로 맞습니다. 이것은 MySQL의 문제이며 django입니다. 이것을 답으로 써 주시면 받아 들일 것입니다. 감사. –

답변

2

이것은 발행상의 문제입니다. 이 동작을 피하기 위해 'isolation level read commited'로 긴장을 풀 수 있습니다. 또한이 발급 수준의 영향에 대해 알아보십시오 (phantoms).

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

참고로 현재 MySQL 격리 수준은 다음을 사용하여 확인할 수 있습니다.'select @@ session.tx_isolation; ' –

+0

"동시성 예외"의 예를 들려 줄 수 있습니까? –

+0

두 명의 사용자가 동시에 데이터베이스의 동일한 데이터를 변경하려고하면 병행 예외가 발생합니다. 이보다 더 복잡합니다 : 각각의 격리 수준은 서로 다른 규칙을 가지고 있으며, 트랜잭션은 여러 데이터 변경을 처리 할 수 ​​있습니다. – danihp