Changes between Version 4 and Version 5 of Transactions


Ignore:
Timestamp:
08/28/25 20:45:29 (10 days ago)
Author:
221071
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Transactions

    v4 v5  
    7777=== 2. Трансакција за оценување на корисник
    7878{{{
    79 @Transactional
    80     public void updateUserRating(Long userId, BigDecimal newRating) {
     79@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     80public UserD updateUserProfile(Long userId,
     81                               String firstName,
     82                               String lastName,
     83                               String street,
     84                               String number,
     85                               String municipality,
     86                               String city,
     87                               String country,
     88                               String bio) {
     89    try {
     90        System.out.println("=== ЗАПОЧНУВАЊЕ НА ТРАНСАКЦИЈА ЗА ПРОФИЛ ===");
     91       
    8192        UserD user = userRepository.findById(userId)
    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}
    83117
    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     }
    94118}}}
    95 Методот updateUserRating() е анотиран со `@Transactional` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска единица: прво се чита тековната оценка на корисникот од базата, потоа се пресметува новата просечна оценка. Доколку овој метод не претставуваше трансакција можеше да се случи следново: два корисника истовремено да му постават оценка на ист корисник што би резултирало со загуба на една од оценките.
     119Методот updateUserProfile() е анотиран со `@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)` бидејќи содржи две поврзани операции кои мора да се извршат како една атомска целина: прво се ажурира и зачувува адресата на корисникот во табелата **Address**, а потоа се ажурира и зачувува профилот на корисникот во табелата **UserD**.
     120
     121Доколку методот не беше означен со `@Transactional`, можно е да се случи успешна промена на адресата, но да настане грешка при зачувувањето на податоците за корисникот. Во таков случај, би постоела адресата во базата, но без ажуриран профил, што води до неконзистентна состојба. Трансакцијата гарантира дека и двете операции ќе успеат заедно (корисник со нови податоци и нова адреса) или, во случај на грешка, нема да се направи никаква промена.
    96122
    97123=== 3.Трансакција за креирање на имот со слики