比方說,我有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(),你希望django什麼時候發送COMMIT到數據庫? 我認爲直觀的答案是,django在foo()方法的末尾發出一個COMMIT。然而,Django發送兩個COMMIT,一個在bar()的末尾,另一個在foo()的末尾。這樣做的結果是事務修飾器永遠不能嵌套或者會發生非常糟糕的事情。 –
並非真正的「特定於數據庫」,嵌套事務通過'SAVEPOINT/ROLLBACK TO SAVEPOINT/RELEASE SAVEPOINT'命令在所有主要數據庫中都可用 - 這些命令似乎在PostgreSQL,SQLite和MySQL中的工作方式相同。 – intgr
在Django中,1.4之前不支持保存點(請注意,原文是在2009年)。即使如此,你仍然有通常的InnoDB/MyISAM的爭論 - 這並不是說你不應該使用該功能,但更多的是開發人員應該考慮如果支持未啓用應該怎麼做。 –