Metoda create() w Django tworzy instancję modelu, a następnie wywołuje metodę save(), która mówi, że wyzwala zatwierdzenie. Więc nie powinno być żadnej różnicy w wyzwalaniu zatwierdzenia transakcji.Django: Różnica między save() i create() z perspektywy transakcji
Ale w rzeczywistości, wykonując metodę, która tworzy grupę instancji modelu przy użyciu funkcji create() na Postgresql, otrzymuję wyjątek transaction aborted, commands ignored until end of transaction
. Metoda działa dobrze z nie-transakcyjnych baz danych db. Ponadto, gdy zamieniam create() s na:
m = Model(attr1=..., attr2=...)
m.save()
działa również na poziomie Postgresql.
Czy istnieje różnica między używaniem save()
i create()
w znaczeniu transakcji?
edit: create() również ustawia self._for_write = True
przed wywołaniem save(), ale nie mogłem śledzić to, aby zobaczyć, czy ma ona żadnego wpływu na zachowanie transakcji.
edycja: przykładowy kod można znaleźć here.
dzięki za odpowiedź. dodałem link do przykładowego kodu do pytania. proszę dać mi znać, jeśli pomoże ci dalsze wyjaśnienie. – omat
Może to być problem transakcyjny, taki jak ten: http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django/2235624#2235624 (zauważ, że to MySQL-specyficzne), ale patrząc na twój kod widzę, że dwie wersje nie są równoważne - działająca wersja 'get() s' przez' slug' i 'create() s' z' name', podczas gdy druga wersja ' create() s' z 'name' ** i **' slug'. Być może ta asymetria stoi za problemem. –