Eksperymentuję z użyciem wzorca poleceń, aby umożliwić mojej warstwie internetowej pracę z elementami Hibernacji w kontekście pojedynczej transakcji (co pozwala uniknąć wyjątków leniwego ładowania). Jestem jednak teraz zdezorientowany tym, jak powinienem postępować z transakcjami.Wiosenna @Transakcyjna propaganda tylko do odczytu
Moje polecenia wywołują metody warstwy usługi opatrzone adnotacjami z adnotacjami @Transactional
. Niektóre z tych metod warstwy usług są tylko do odczytu - np. @Transactional(readOnly=true)
- a niektóre z nich to odczyt/zapis.
Moja warstwa usługi udostępnia obsługę komend, która wykonuje polecenia przekazane do niej w imieniu warstwy internetowej.
@Transactional
public Command handle(Command cmd) throws CommandException
Przypuszczam, że mam rację w tworzeniu obsługi Polecenie za handle()
metody transakcyjne. W tym miejscu pojawia się zamieszanie. Jeśli implementacja polecenia wywołuje metody z wieloma warstwami usług, nie ma sposobu, aby program obsługi wywoływania wiedział, czy operacje wywoływane w komendzie będą tylko do odczytu, do odczytu/zapisu lub kombinacji z dwóch.
Nie rozumiem, w jaki sposób propagacja działa w tym przykładzie. Jeśli miałbym wykonać handle()
metodę handle()
metoda readOnly=true
, co się stanie, jeśli polecenie następnie wywoła metodę warstwy usługi, która jest opatrzona komentarzem z @Transactional(realOnly=false)
?
byłbym wdzięczny lepsze zrozumienie tego i komentarze mile widziane ...
Andrew
Więc który z obu przeciwstawnych odpowiedzi jest prawdziwa? Czy ktoś chciał sprawdzić? – LuGo
Od 'handle()' _may_ metody wywołania, które zapisują, transakcja musi dopuszczać zapisy. To byłoby w porządku i poprawne rozwiązanie. Jeśli naprawdę chciałeś, możesz zbadać uruchamianie programowo TX i przełączanie readOnly - być może za pomocą atrybutu Command - ale poważnie wątpię, że to warte wysiłku. –