Sobes.tech
Middle

Spring Data'da @Transactional anotatsiyasi nima?

sobes.tech AI

AIdan javob

Spring Data'da @Transactional anotatsiyasi, metod yoki sinfning tranzaksiya doirasida bajarilishini ko'rsatadi. Spring AOP (Aspect-Oriented Programming) bunday metod atrofida proxy ob'ektini yaratadi va tranzaksiya hayot aylanishini boshqaradi.

@Transactional bilan bajariladigan asosiy harakatlar:

  1. Tranzaksiya boshlanishi: Belgilangan metodni bajarishdan oldin yangi tranzaksiya ochiladi yoki mavjud tranzaksiya ishlatiladi.
  2. Metodning bajarilishi: Metodning o'zi logikasi bajariladi.
  3. Tranzaksiyaning tasdiqlanishi yoki bekor qilinishi:
    • Agar metod muvaffaqiyatli va xatoliksiz tugasa (standartda faqat RuntimeException), tranzaksiya tasdiqlanadi (commit).
    • Agar metoddan xatolik chiqarilsa (standartda RuntimeException), tranzaksiya bekor qilinadi (rollback).

Asosiy atributlar:

  • propagation: Tranzaksiyalar qanday o'zaro ta'sir qilishini belgilaydi (masalan, REQUIRED, REQUIRES_NEW, SUPPORTS). Standartda REQUIRED.
  • isolation: Tranzaksiya izolyatsiya darajasini belgilaydi, shunda parallel ma'lumotlarga kirishda muammolar oldini olinadi (masalan, READ_COMMITTED, REPEATABLE_READ). Standartda ma'lumotlar bazasining izolyatsiya darajasi ishlatiladi.
  • readOnly: Tranzaksiya faqat o'qish rejimida bajarilishi kerakligini ko'rsatadi. O'qish uchun ishlash samaradorligini oshiradi.
  • timeout: Tranzaksiya maksimal bajarish vaqtini belgilaydi, undan keyin avtomatik bekor qilinadi.
  • rollbackFor: Qaysi xatolik turlari yuzaga kelganda tranzaksiya bekor qilinishi kerakligini ko'rsatadi. Standartda RuntimeException uchun rollback.
  • noRollbackFor: Qaysi xatolik turlari yuzaga kelganda tranzaksiya bekor qilinmasligi kerakligini ko'rsatadi.

Misol:

// Xizmat qatlamining misoli
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Bu metod tranzaksiya ichida bajariladi
    public User createUser(User user) {
        // Foydalanuvchi yaratish logikasi, ehtimol, bir nechta DB operatsiyalarini o'z ichiga oladi
        userRepository.save(user);
        // Boshqa saqlash yoki yangilash operatsiyasi bo'lishi mumkin
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Faqat o'qish uchun, optimallashtirish
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Maxsus xatolikda rollback
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Kritik operatsiya logikasi
        // CustomBusinessException chiqarishi mumkin
    }
}

@EnableTransactionManagement anotatsiyasi odatda konfiguratsiya sinfida ishlatiladi va deklarativ tranzaksiya boshqaruvini yoqish uchun qo'llaniladi.