Middle
Spring Dataда @Transactional белгиси эмне мааниге ээ?
sobes.tech AI
AIден жооп
Spring Data ичинде @Transactional аннотациясы метод же класс транзакциянын чегинде иштеши керектигин көрсөтөт. Spring AOP (Aspect-Oriented Programming) мындай методдун тегерегинде прокси-объект түзүп, ал транзакциянын жашоо циклин башкарет.
@Transactional тарабынан аткарылуучу негизги аракеттер:
- Транзакцияны баштоо: Анотталган методдун аткарылышы алдында жаңы транзакция ачылат же бар болсо, колдонулат.
- Методду аткаруу: Методдун логикасы ишке ашырылат.
- Транзакцияны бекитүү же кайтаруу:
- Эгер метод ийгиликтүү аяктап, эч кандай ката чыкпаса (өзгөртүүсүз
RuntimeException), транзакция бекитилет (commit). - Эгер метод ката менен аякса (өзгөртүүсүз
RuntimeException), транзакция кайтарылат (rollback).
- Эгер метод ийгиликтүү аяктап, эч кандай ката чыкпаса (өзгөртүүсүз
Негизги мүнөздөмөлөрү:
propagation: Транзакциялар бири-бири менен кандайча өз ара аракеттенет (мисалы,REQUIRED,REQUIRES_NEW,SUPPORTS). Бөлүмдө —REQUIRED.isolation: Транзакциянын изоляция деңгээли, бул бир нече операциянын бири-бирине таасирин азайтуу үчүн (мисалы,READ_COMMITTED,REPEATABLE_READ). Бөлүмдө — базанын изоляция деңгээли.readOnly: Транзакция тек гана окуу режиминде иштеши керектигин көрсөтөт. Окуу операцияларынын натыйжалуулугун жакшыртат.timeout: Транзакциянын максималдуу иштөө убактысы, автоматтык түрдө кайтарылгандан мурун.rollbackFor: Транзакция кайтарылышы керек болгон ката түрлөрүнүн тизмеси. Бөлүмдө —RuntimeException.noRollbackFor: Транзакция кайтарылбашы керек болгон ката түрлөрүнүн тизмеси.
Колдонуу мисалы:
// Кызматтык катмар мисалы
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // Бул метод транзакцияда иштейт
public User createUser(User user) {
// Колдонуучуну түзүү логикасы, ал бир нече операцияларды камтышы мүмкүн
userRepository.save(user);
// Башка сактоо же жаңыртуу операциясы болушу мүмкүн
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Окуу гана, оптималдаштыруу
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Кээ бир каталарда кайтаруу
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Аварийдүү операциянын логикасы
// CustomBusinessException чыгарышы мүмкүн
}
}
@EnableTransactionManagement аннотациясы адатта конфигурациялык класс ичинде колдонулат, декларативдүү транзакцияларды башкарууну ишке ашыруу үчүн.