Sobes.tech
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:

  1. 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.
  2. Metodun icrası: Metodun özü olan loqika icra olunur.
  3. 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).

Ə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). Standart REQUIRED.
  • 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.