2013-08-01 48 views
5

Jaka jest różnica między poniższymi czynnościami?Jaka jest różnica między withTransaction i NewTransaction?

def someAction() { 
    User.withTransaction { ... } 
} 

i

def someAction() { 
    User.withNewTransaction { ... } 
} 
  1. Kiedy używać co?

  2. Gdy akcja grails zawiera tylko blok transakcji. W tym przypadku domyślam się, że transakcja i NewTransaction są takie same, ponieważ każda akcja ma swoją własną transakcję. Czy to prawda?

+1

Wyobrażam sobie, że pierwszy wariant będzie uczestniczył w istniejącej transakcji, jeśli istniał lub rozpoczął, jeśli nie, a drugi zawsze rozpoczyna nową transakcję, niezależnie od tego, czy ktoś już jest exexuting – cmbaxter

+0

Zaktualizowałem moje pytanie. Co myślisz o pytaniu 2? – confile

+0

Zgadzam się z @cmbaxter, tylko notatką boczną: kontrolery powinny być tak proste, jak to tylko możliwe, tylko obsługa zgłoszeń. Jeśli chcesz pracować z transakcjami, usługa to lepsze miejsce (już są transakcyjne). –

Odpowiedz

10

Uważam, że te funkcje mają do czynienia z semantyką izolacji transakcji. Funkcja withTransaction będzie uczestniczyć w istniejącej transakcji, jeśli została już uruchomiona i jeśli nie została uruchomiona, uruchomi się nowa. Metoda withNewTransaction zawsze rozpocznie nową transakcję, niezależnie od tego, czy już została uruchomiona, izolując kod wewnątrz tego bloku na jego własną transakcję (z własnym zatwierdzeniem/wycofaniem).

Jeśli uważasz, że opracowywana metoda powinna lub może uczestniczyć w większej transakcji z wieloma oddzielnymi zapisami db, powinieneś użyć withTransaction, aby w razie potrzeby móc uczestniczyć w większej transakcji. Jeśli chcesz, aby Twój zapis był całkowicie odizolowany od innych zapisów db, jeśli trwa inna transakcja (i nie potencjalnie wycofać tej innej transakcji, jeśli ten kod się nie powiedzie), użyj withNewTransaction.

Jeśli chodzi o twoje drugie pytanie, te dwa zachowania będą zachowywać się tak samo, jeśli będą stanowiły jedyne wezwanie w akcji, ponieważ obaj rozpoczynają nową transakcję.