| 76 | |
| 77 | == 2. Трансакција за оценување на корисник |
| 78 | {{{ |
| 79 | @Transactional |
| 80 | public void updateUserRating(Long userId, BigDecimal newRating) { |
| 81 | UserD user = userRepository.findById(userId) |
| 82 | .orElseThrow(() -> new IllegalArgumentException("User not found")); |
| 83 | |
| 84 | if (user.getRating().compareTo(BigDecimal.ZERO) == 0) { |
| 85 | user.setRating(newRating); |
| 86 | } else { |
| 87 | BigDecimal average = user.getRating() |
| 88 | .add(newRating) |
| 89 | .divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP); |
| 90 | user.setRating(average); |
| 91 | } |
| 92 | userRepository.save(user); |
| 93 | } |
| 94 | }}} |
| 95 | Методот updateUserRating() е анотиран со `@Transactional` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска единица: прво се чита тековната оценка на корисникот од базата, потоа се пресметува новата просечна оценка. Доколку овој метод не претставуваше трансакција можеше да се случи следново: два корисника истовремено да му постават оценка на ист корисник што би резултирало со загуба на една од оценките. |