2011-11-19 2 views
2

양식을 제출할 때 두 개의 개체를 데이터베이스에 저장해야합니다. 그러나 첫 번째 저장과 두 번째 저장 사이에 오류가 있으면 데이터베이스의 첫 번째 개체가 계속 표시됩니다.Django 트랜잭션 요청은 실패하지만 여전히 부분적으로 커밋합니다.

주 설정에서 TransactionMiddleware를 활성화했기 때문에 요청 실패로 인해이 요청의 결과로 생성 된 데이터베이스 업데이트를 롤백하고 싶습니다. 다음과 같이

내 코드는 다음과 같습니다 난 이후에 데이터베이스를 조회 할 때

def submit(request): 
    form1 = Form1(request.POST) 
    form2 = Form2(request.POST) 

    obj1 = form1.save() 

    # simulate an error 
    raise Exception('spam', 'eggs') 

    obj2 = form2.save(commit=False) 
    obj2.obj1 = obj1 
    form2.save() 

은으로 obj1가 존재합니다. 어떻게하면 실패로 인해 obj1 트랜잭션을 롤백 할 수 있습니까?

(나는 데코레이터 @ transaction.commit_on_success를 넣으려고했지만 obj1은 여전히 ​​데이터베이스에 저장되어있다.)

+1

어떤 데이터베이스를 사용하고 있습니까? – second

답변

2

모두 사용하는 데이터베이스에 따라 다르며, MySQL의 경우 테이블이 Innodb (최근에 기본값이 아닐 때까지)를 사용해야합니다.

https://docs.djangoproject.com/en/dev/topics/db/transactions/

+0

True - MySQL을 사용하고 있으며 기본 엔진은 MyISAM입니다. 나는 모든 테이블의 기존 스토리지 엔진을 수동으로 변경하는 것뿐만 아니라 기본 스토리지 엔진을 innodb로 설정했습니다. 그러나 요청이 실패하면 obj1을 롤백하는 것을 여전히 거부합니다. –

관련 문제