Poszukuję ogólnego wzorca kodu, aby prawidłowo obsługiwać transakcję pod kątem możliwego wyjątku. Zakładam, że istnieje wspólny wzór kodu, bez względu na konkretny rodzaj transakcji, z którą mamy do czynienia.Jaki jest prawidłowy wzorzec kodu do sfinalizowania transakcji w języku Java (wycofanie w przypadku wyjątku i zatwierdzenie w przypadku sukcesu)?
Mam metodę, która wykonuje coś w transakcji i chce ponownie wyrzucić wyjątek, który może wystąpić, gdy wewnątrz bloku kodu transakcyjnego. Oto przykład takiej metody:
protected void doIt() {
// for JDBC connection transaction may be started automatically
// but assume we start it here
Tran tran = session.beginTran();
try {
// here comes code that does some processing
// modifies some data in transaction
// etc.
// success - so commit
tran.commit();
} catch (Exception ex) { // many different exceptions may be thrown
// subclass of RuntimeException, SQLException etc.
// error - so rollback
tran.rollback();
// now rethrow ex
throw ex; // this line causes trouble, see description below
}
}
teraz - nie ma skompilować błąd w metodzie doIt
. Musi deklarować throws Exception
, ale jest to niedopuszczalne, ponieważ metoda doIt
jest używana w wielu miejscach i dodanie throws Exception
prowadzi do kolejnych modyfikacji w miejscach bezpośredniego i pośredniego użycia doIt
. Jest to spowodowane znanym problemem projektowania języka Java z zadeklarowanymi wyjątkami.
Teraz pytanie: jak zmienić wyjątek vs transakcji przenoszenia kodu, aby osiągnąć swój cel - właściwie obsłużyć finalizację transakcji (wykonanie zobowiązania lub wycofania na podstawie stanu sukces) i przekaż dokładnie ten sam wyjątek, który może być catched w kodzie transakcyjnej blok.
Wiem, że mogłem zrobić coś takiego jak throw new RuntimeException(ex)
, ale to rzuca wyjątek innej klasy i chcę uniknąć takiego rozwiązania.
Musisz być świadomy współbieżności - prawie wszystkie systemy transakcyjne wydają się być używane w kontekście współbieżnym, a ten kod nie wydaje się być szczególnie chroniony przed tym ... –
to jest świetne rozwiązanie. – jspcal
@Alex: co to ma wspólnego ze współbieżnością? Co jest nie tak z tym kodem, biorąc pod uwagę współbieżność? Jak "bronić"? Czy mógłbyś wyjaśnić? – WildWezyr