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:
- Tranzakció kezdete: A megjelölt módszer végrehajtása előtt új tranzakció nyílik vagy meglévő használata történik.
- A módszer végrehajtása: A módszer logikája fut.
- 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).
- Ha a módszer sikeresen, kivéve kivételekkel (alapértelmezés szerint csak
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éntREQUIRED.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 szerintRuntimeException.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.