Po pierwsze, zarządzanie transakcjami powinno odbywać się na warstwie usługi, a nie na warstwie DAO, ponieważ spowodowałoby to znaczne obciążenie wydajności (w celu radzenia sobie z odpowiednim poziomem izolacji transakcji i propagacją dla każdej innej metody). Ponadto zakres jednostki pracy pochodzi z warstwy usług zamiast z warstwy dostępu do danych: wyobraź sobie wykonanie procesu biznesowego, który musi poradzić sobie z 2 lub więcej DAO.
W Internecie jest wiele dyskusji na ten temat, tak jak tutaj , tutaj i tutaj .
W każdym razie, ponieważ jest to wywiad, przyjmijmy takie pytanie, jakie jest. Z mojego punktu widzenia używałbyś @Transactional
adnotacji (lub konfiguracji XML) w obu metodach i przy propagacji transakcji z REQUIRED
wartością. W ten sposób, po wywołaniu którejkolwiek z tych metod i jeśli nie istnieje żadna poprzednia transakcja, zostanie utworzona nowa transakcja:
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
foo()
ibar()
dzieli tę samą transakcję, a jeśli jedna zawiedzie, kolejna 1 również zostanie wycofana? Czy możesz podać jakieś wyjaśnienie?@Transactional(propagation = REQUIRED)
metodę warstwy DAO do propagacji i@Transactional
warstwy usługi, ale jeśli nałożę@Transactional
warstwę usługi tylko zamiast warstwy DAO, jaka jest różnica?propagation = REQUIRED
jest wartością domyślną dla propagacji adnotacji transakcyjnej, więc jej zapisanie nie jest konieczne.Ignorując wiosnę i frameworki w mojej odpowiedzi ..... podstawowa idea używania parametrów funkcji. Jestem pewien, że koncepcja mogłaby mieć zastosowanie w [wstaw tutaj strukturę].
Będziesz musiał obsługiwać zatwierdzenie / wycofanie poza 2 metodami DAO. Dwie metody musiałyby przyjąć transakcję / połączenie jako dane wejściowe.
kod psuedo:
źródło
Tran t
jako parametr w obu metodach. Czy możesz podać jakieś wyjaśnienie?Istnieje szansa, że dwie metody powinny działać niezależnie także w tym samym czasie, gdy może działać w tej samej transakcji, więc musimy użyć opcji Propagacji. Jeśli transakcja musi przebiegać w tej samej transakcji, użyje pierwszej transakcji, w przeciwnym razie zostanie utworzona nowa transakcja, jeśli zostanie wywołana niezależnie. Popraw mnie, jeśli się mylę.
źródło