Middle
Spring Data-da @Transactional qeydiyyatı nə deməkdir?
sobes.tech Süni İntellekt
AI-dan cavab
Spring Data'da @Transactional annotasiyası, metodun və ya sinfin tranzaksiya çərçivəsində icra olunmasını göstərir. Spring AOP (Aspect-Oriented Programming) bu metodun ətrafında proxy obyekti yaradır və tranzaksiya həyat dövrünü idarə edir.
@Transactional ilə həyata keçirilən əsas fəaliyyətlər:
- Tranzaksiyanın başlanması: Annotasiya olunmuş metod icra edilmədən əvvəl yeni tranzaksiya açılır və ya mövcud tranzaksiya istifadə olunur.
- Metodun icrası: Metodun özü olan loqika icra olunur.
- Tranzaksiyanın təsdiqlənməsi və ya geri alınması:
- Əgər metod uğurla və istisnasız (standart olaraq yalnız
RuntimeException) tamamlanarsa, tranzaksiya təsdiqlənir (commit). - Əgər metoddan istisna atılırsa (standart olaraq
RuntimeException), tranzaksiya geri alınır (rollback).
- Əgər metod uğurla və istisnasız (standart olaraq yalnız
Əsas atributlar:
propagation: Tranzaksiyaların bir-biri ilə necə qarşılıqlı əlaqədə olacağını müəyyən edir (məsələn,REQUIRED,REQUIRES_NEW,SUPPORTS). StandartREQUIRED.isolation: Tranzaksiyanın izolyasiya səviyyəsini müəyyən edir, beləliklə, paralel məlumatlara girişdə problemlər qarşısı alınır (məsələn,READ_COMMITTED,REPEATABLE_READ). Standart olaraq, verilənlər bazasının izolyasiya səviyyəsi istifadə olunur.readOnly: Tranzaksiyanın yalnız oxuma rejimində icra olunmasını göstərir. Oxuma əməliyyatlarının performansını optimallaşdırır.timeout: Tranzaksiyanın avtomatik geri alınmasına qədər olan maksimum vaxtı təyin edir.rollbackFor: Hangi növ istisnaların baş verməsi halında tranzaksiyanın geri alınacağını göstərir. Standart olaraq,RuntimeExceptionüçün geri alınır.noRollbackFor: Hangi növ istisnaların baş verməsi halında tranzaksiyanın geri alınmaması lazım olduğunu göstərir.
İstifadə nümunəsi:
// Xidmət qatının nümunəsi
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // Bu metod tranzaksiya daxilində icra olunacaq
public User createUser(User user) {
// İstifadəçi yaradılması loqikası, ehtimal ki, bir neçə DB əməliyyatını əhatə edir
userRepository.save(user);
// Başqa saxlama və ya yeniləmə əməliyyatı ola bilər
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Yalnız oxuma üçün, optimallaşdırma
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Xüsusi istisna halında geri alma
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Kritik əməliyyatın loqikası
// CustomBusinessException ata bilər
}
}
@EnableTransactionManagement annotasiyası adətən konfiqurasiya sinfinda istifadə olunur və deklarativ tranzaksiya idarəsini aktivləşdirir.