82 | | .orElseThrow(() -> new IllegalArgumentException("User not found")); |
| 93 | .orElseThrow(() -> new IllegalArgumentException("Корисник не е пронајден со ID: " + userId)); |
| 94 | |
| 95 | user.setFirstName(firstName); |
| 96 | user.setLastName(lastName); |
| 97 | user.setBio(bio); |
| 98 | |
| 99 | Address address = user.getAddress(); |
| 100 | address.setStreet(street); |
| 101 | address.setNumber(number); |
| 102 | address.setMunicipality(municipality); |
| 103 | address.setCity(city); |
| 104 | address.setCountry(country); |
| 105 | |
| 106 | addressRepository.save(address); |
| 107 | UserD savedUser = userRepository.save(user); |
| 108 | |
| 109 | System.out.println("ПРОФИЛ АЖУРИРАН ЗА КОРИСНИК: " + firstName + " " + lastName); |
| 110 | return savedUser; |
| 111 | |
| 112 | } catch (Exception e) { |
| 113 | System.err.println("ГРЕШКА ВО ТРАНСАКЦИЈА ЗА ПРОФИЛ: " + e.getMessage()); |
| 114 | throw new RuntimeException("Грешка при ажурирање на профил: " + e.getMessage(), e); |
| 115 | } |
| 116 | } |
95 | | Методот updateUserRating() е анотиран со `@Transactional` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска единица: прво се чита тековната оценка на корисникот од базата, потоа се пресметува новата просечна оценка. Доколку овој метод не претставуваше трансакција можеше да се случи следново: два корисника истовремено да му постават оценка на ист корисник што би резултирало со загуба на една од оценките. |
| 119 | Методот updateUserProfile() е анотиран со `@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска целина: прво се ажурира и зачувува адресата на корисникот во табелата **Address**, а потоа се ажурира и зачувува профилот на корисникот во табелата **UserD**. |
| 120 | |
| 121 | Доколку методот не беше означен со `@Transactional`, можно е да се случи успешна промена на адресата, но да настане грешка при зачувувањето на податоците за корисникот. Во таков случај, би постоела адресата во базата, но без ажуриран профил, што води до неконзистентна состојба. Трансакцијата гарантира дека и двете операции ќе успеат заедно (корисник со нови податоци и нова адреса) или, во случај на грешка, нема да се направи никаква промена. |