2009-09-20 13 views
10

Mam projekt django, w którym wartości bazy danych trzeba dość często aktualizować na własną rękę. Istnieje cronjob, który uruchamia aktualizację tych wartości w bazie danych, ale niektóre operacje wymagają transakcji atomowych. Czy ktokolwiek wie, jak uczynić metodę modelową pełną transakcją w django bez przechodzenia przez widoki?Zarządzanie transakcjami Django

Idealnie, chciałbym móc rozpocząć transakcję na początku metody i zatwierdzić ją na końcu, a następnie po prostu móc wywołać tę metodę z dowolnego miejsca (widok lub cronjob) z zagwarantować, że metoda jest atomowa.

Jeśli wiesz, jak to zrobić, muszę również wiedzieć, czy w przypadku niepowodzenia zatwierdzenia (z powodu równoczesnego zapisu lub czegoś podobnego), transakcja zostanie automatycznie ponownie podjęta lub jeśli będę musiał ręcznie wychwycić wyjątek awarii i ponownie wywołać metodę.

Dziękuję.

Odpowiedz

15

Czy obejrzałeś Django na transaction docs? Zwłaszcza dekorator @transaction.commit_on_success (source code). Zatwierdza transakcję, jeśli udekorowana funkcja powraca bez zgłaszania wyjątku. Wystąpienie wyjątku powoduje wycofanie zmian.

+5

Tak, jest to odpowiednie rozwiązanie. Myślę, że PO był zaniepokojony, ponieważ dokumentacja odnosi się tylko do nich w połączeniu z widokami, a nie metodami modelowymi, ale patrząc na źródło, nie ma tam niczego, co nie działałoby poza poglądem. –

+5

Na tej stronie dokumentacji jest napisane: "Chociaż poniższe przykłady wykorzystują funkcje widoku jako przykłady, te dekoratory można również zastosować do funkcji innych niż widok". –

+0

Dzięki. Czy zdajesz sobie sprawę, co się stanie, jeśli spróbujesz zapisu symultanicznego? Czy transakcja ponownie podejmuje próbę, a jeśli nie, to co ona rzuca? Dzięki! – So8res

Powiązane problemy