Sobes.tech
Middle

Spring Dataда @Transactional белгиси эмне мааниге ээ?

sobes.tech AI

AIден жооп

Spring Data ичинде @Transactional аннотациясы метод же класс транзакциянын чегинде иштеши керектигин көрсөтөт. Spring AOP (Aspect-Oriented Programming) мындай методдун тегерегинде прокси-объект түзүп, ал транзакциянын жашоо циклин башкарет.

@Transactional тарабынан аткарылуучу негизги аракеттер:

  1. Транзакцияны баштоо: Анотталган методдун аткарылышы алдында жаңы транзакция ачылат же бар болсо, колдонулат.
  2. Методду аткаруу: Методдун логикасы ишке ашырылат.
  3. Транзакцияны бекитүү же кайтаруу:
    • Эгер метод ийгиликтүү аяктап, эч кандай ката чыкпаса (өзгөртүүсүз 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 аннотациясы адатта конфигурациялык класс ичинде колдонулат, декларативдүү транзакцияларды башкарууну ишке ашыруу үчүн.