Java - Bezpieczeństwo transakcji w try-catchu (JPA)

0

Hej, mam pytanie związane z try-catchem. Tworzę apkę , w której chcę zmienić dane w bazie tylko i wyłącznie jeśli wszystko się powiedzie. Posłużę się pseudokodem, żeby to lepiej przedstawić:

Bigdecimal userBalance = user.getBalance();
Set<Transactions> userTransactions = user.getTransactions();

try{
BigDecimal newBalance= countBalance(..);
user.setBalance(newBalance);
user.addTransaction(..);

catch (Exception e){
//przywracanie danych z przed próby dokonania transakcji
user.setBalance(userBalance);
user.setTransactions(userTransactions);
throw new Exception("Transaction fail")
}
userRepository.save(user);

Czy zapisywanie stanu z przed transakcji i przypisywanie je w catchu nie jest przypadkiem zbędne? W razie gdy w try (np w metodzie countBalance() poleci exception, to i tak userRepository.save(user) nie zostanie wykonane i w bazie nie pojawią się niespójne dane.
Dobrze to rozumiem?

Ewentualnie czy można tego try-catcha zastąpić @Transactional nad metodą? Czy to działa tak, że jeśli gdziekolwiek w trakcie wykonywania metody poleci wyjątek, to jest przywracany stan z przed transakcji?

2

No po to generalnie jest transactional żeby poprzez mechanizm AOP zarządzać transakcjami. Jeśli w metodze która jest "osłonięta" przez proxy Springowe do transakcji zostanie wyrzucony rutimimowy wyjątek to transakcja zostanie cofnięta. Co więcej, nie da się inaczej za bardzo zarządzać transakcjami jak korzystasz ze Spring Data JPA.

Więcej do poczytania

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0