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:
- Tranzaksiya boshlanishi: Belgilangan metodni bajarishdan oldin yangi tranzaksiya ochiladi yoki mavjud tranzaksiya ishlatiladi.
- Metodning bajarilishi: Metodning o'zi logikasi bajariladi.
- 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).
- Agar metod muvaffaqiyatli va xatoliksiz tugasa (standartda faqat
Asosiy atributlar:
propagation: Tranzaksiyalar qanday o'zaro ta'sir qilishini belgilaydi (masalan,REQUIRED,REQUIRES_NEW,SUPPORTS). StandartdaREQUIRED.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. StandartdaRuntimeExceptionuchun 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.