Sobes.tech
Middle

Šta je anotacija @Transactional u kontekstu Jave?

sobes.tech АИ

Одговор од АИ

Аннотација @Transactional у Јави се користи за декларативно управљање трансакцијама. Она омогућава одређивање граница трансакција, указујући које методе треба да се извршавају у оквиру једне трансакције.

Главни аспекти:

  • Интеграција: Најчешће се користи у комбинацији са Spring Framework-ом, EJB-ом или другим оквирима који пружају управљање трансакцијама.
  • Проксирање: Оквир креира прокси-објекат који обавија циљни објекат са анотираним методама. Пре позива анотираног метода, прокси почиње трансакцију, а након његовог извршења, фиксира или враћа трансакцију у зависности од резултата (да ли је изузеће изазвано).
  • Атрибути: Има различите атрибуте за конфигурацију понашања трансакције, као што су:
    • propagation: одређује како ће се понашати трансакциони метод приликом позива из другог трансакционог контекста. На пример, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY.
    • isolation: одређује ниво изолације за трансакцију. На пример, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
    • readOnly: указује да се трансакција извршава само за читање података, што понекад омогућава оптимизацију перформанси.
    • timeout: поставља време чекања за трансакцију.
    • rollbackFor и noRollbackFor: указују на то која изузећа треба да доведу до враћања или не враћања трансакције.

Пример коришћења:

// Пример коришћења у Spring-у
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    // Овај метод ће се извршавати у оквиру трансакције
    @Transactional
    public void createUser() {
        // Логика креирања корисника и чувања у базу података
        // Ако се изазове RuntimeException, Spring ће враћати трансакцију
    }

    // Овај метод ће се извршавати у оквиру трансакције са одређеним подешавањима
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public User findUserById(Long id) {
        // Логика претраге корисника
        return null; // Пример
    }
}

@Transactional поједностављује управљање трансакцијама, омогућавајући програмеру да се фокусира на пословну логике, а не на ниско ниво API-ја управљања трансакцијама (нпр. JTA или JDBC Connection).