나는 다음 코드 조각은이 모델의 방법을 저장 재정의 한 :장고 롤백 트랜잭션
@transaction.commit_on_success
def save(self, *args, **kwargs):
try:
transaction.commit()
self.qa.vote_down_count += 1
self.qa.save()
super(self.__class__, self).save(*args, **kwargs)
except:
transaction.rollback()
raise
else:
transaction.commit()
예상되는 행동이 될 것이다 : self.qa 속성 vote_down_count이 하나씩 증가하지만,있는 경우입니다 예외는 트랜잭션 롤백 (즉, self.qa.vote_down_count + = 1이 데이터베이스에서 커밋되지 않음을 의미)하는 슈퍼 (자체) 저장 메소드에서 발생합니다.
실제 동작은 다음과 같습니다. self.qa.vote_down_count + = 1은 IntegrityError 예외가 수퍼 (자체) 저장에서 발생하더라도 데이터베이스에 커밋됩니다.
아무튼?
왜 처음에는 커밋을하고 마지막에는 다시 커밋할까요? –
커밋 된 트랜잭션과 이전에 온 모든 것을 커밋하도록하지 않겠습니까? –
이것은 사용중인 데이터베이스에 크게 의존 할 것입니다 .Postgres 8.0+와 Oracle은 트랜잭션을 적절하게 지원합니다 .MySQL은 그다지 훌륭하게 플레이하지 못합니다. 대부분의 다른 데이터베이스는 전혀 지원하지 않습니다. 그래서 질문 하나는 "귀하의 DB가 실제로 트랜잭션을 지원합니까?" –