app1.models.ModelOne
이라는 모델을 저장하고 @commit_on_success
으로 장식했다고 가정 해 봅시다. ModelOne.save()
에 잡힌 모든 예외가 다시 제기됩니다. model_one_instance.save()
에서 제대로 작동합니다.django의 중첩 트랜잭션?
그러나 app2
에 일련 번호를 삽입하여 ModelOne
에 삽입하고 실패 할 경우 모두 롤백해야합니다. 어떻게해야합니까?
app2.jobs.do_the_inserts
을 @commit_on_success
으로 꾸미는 것이 예상대로 작동하지 않습니다.
여러분의 솔루션이 다른 문제를 해결하고 있다고 생각합니다. 예를 들어 foo()와 bar() 두 가지 메소드가 있다고 가정하고 둘 다 @commit_on_success로 꾸며져 있습니다.foo()가 bar()를 호출하면 언제 장고가 COMMIT를 데이터베이스에 보낼 것으로 예상합니까? 직감적 인 대답은 django가 foo() 메서드의 끝에 하나의 COMMIT를 발행한다고 생각합니다. 그러나 Django는 두 개의 COMMIT를 보냅니다. 하나는 bar() 끝에 있고, 다른 하나는 foo() 끝에 있습니다. 결과적으로 트랜잭션 데코레이터는 결코 중첩 될 수 없으며 매우 나쁜 일이 발생할 수 있습니다. –
"데이터베이스 관련"이 아닌 중첩 된 트랜잭션은 PostgreSQL, SQLite 및 MySQL에서 같은 방식으로 작동하는 것처럼 보이는 SAVEPOINT/ROLLBACK TO SAVEPOINT/RELEASE SAVEPOINT 명령을 통해 모든 주요 데이터베이스에서 사용할 수 있습니다. – intgr
Django 내에서 savepoint는 1.4 이전에는 지원되지 않았습니다 (원래 게시물은 2009 년이었습니다). 그럼에도 불구하고, 당신은 여전히 일반적인 InnoDB/MyISAM 토론을하고 있습니다. 이것은 당신이 기능을 사용해서는 안되지만 개발자는 지원이 가능하지 않으면 어떻게해야하는지 생각해야한다고 말하지 않습니다. –