Sobes.tech
Middle

Mit jelent az @Transactional annotáció a Spring Data-ban?

sobes.tech MI

Válasz az MI-től

A @Transactional annotáció a Spring Data-ben azt jelzi, hogy egy módszert vagy osztályt tranzakció keretében kell végrehajtani. A Spring AOP (Aspect-Oriented Programming) egy proxy-objektumot hoz létre ilyen módszerek körül, amely kezeli a tranzakció életciklusát.

A @Transactional által végrehajtott fő műveletek:

  1. Tranzakció kezdete: A megjelölt módszer végrehajtása előtt új tranzakció nyílik vagy meglévő használata történik.
  2. A módszer végrehajtása: A módszer logikája fut.
  3. Tranzakció rögzítése vagy visszavonása:
    • Ha a módszer sikeresen, kivéve kivételekkel (alapértelmezés szerint csak RuntimeException), befejeződik, a tranzakció rögzítésre kerül (commit).
    • Ha a módszer kivételt dob (alapértelmezés szerint RuntimeException), a tranzakció visszavonásra kerül (rollback).

A annotáció fő attribútumai:

  • propagation: Meghatározza, hogyan lépnek kölcsönhatásba a tranzakciók (pl. REQUIRED, REQUIRES_NEW, SUPPORTS). Alapértelmezettként REQUIRED.
  • isolation: Meghatározza a tranzakció elszigeteltségi szintjét, hogy elkerüljék a párhuzamos hozzáférés problémáit (pl. READ_COMMITTED, REPEATABLE_READ). Alapértelmezés szerint az adatbázis izolációs szintje.
  • readOnly: Megjelöli, hogy a tranzakciónak csak olvasási módnak kell lennie. Optimalizálja a teljesítményt olvasáskor.
  • timeout: Meghatározza a tranzakció maximális futási idejét automatikus visszavonásig.
  • rollbackFor: Megadja a kivételek típusainak listáját, amelyek esetén a tranzakció visszavonásra kerül. Alapértelmezés szerint RuntimeException.
  • noRollbackFor: Megadja a kivételek típusainak listáját, amelyek esetén a tranzakció visszavonása nem történik meg.

Használati példa:

// Szolgáltatási réteg példa
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Ez a módszer tranzakcióban fog végrehajtódni
    public User createUser(User user) {
        // Felhasználó létrehozásának logikája, több adatbázis műveletet is tartalmazhat
        userRepository.save(user);
        // Más mentési vagy frissítési művelet is lehet
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Csak olvasási módban, optimalizálás
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Visszavonás egy adott felhasználói kivétel esetén
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Kritikus művelet logikája
        // Dobhat CustomBusinessException kivételt
    }
}

Az @EnableTransactionManagement annotáció általában a konfigurációs osztályban van, hogy engedélyezze a deklaratív tranzakciókezelést.