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ę.
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
Zaktualizowałem moje pytanie. Co myślisz o pytaniu 2? – confile
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). –