| | 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` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска единица: прво се чита тековната оценка на корисникот од базата, потоа се пресметува новата просечна оценка. Доколку овој метод не претставуваше трансакција можеше да се случи следново: два корисника истовремено да му постават оценка на ист корисник што би резултирало со загуба на една од оценките. |