Sobes.tech
Senior

Kodėl metodas su @Transactional gali nesukurti transakcijos?

sobes.tech AI

Atsakymas iš AI

Metodas su anotacija @Transactional gali ne sukurti transakcijos dėl kelių priežasčių:

  • Jei metodas kviečiamas tiesiogiai toje pačioje klasėje (be proxy), Spring ne taikys transakcijos, nes transakcijos veikia per proxy.
  • Jei Spring konfigūracija neįtraukia transakcijų palaikymo arba anotacija nėra atpažįstama.
  • Jei metodas pažymėtas kaip private arba final, proxy negalės jo perrašyti transakcijos kūrimui.
  • Jei jau egzistuoja aktyvi transakcija ir dabartinis metodas yra sukonfigūruotas su propagation, kuris nesukuria naujos transakcijos.

Pavyzdys problemos su kvietimu viduje klasės:

@Service
public class MyService {
    @Transactional
    public void transactionalMethod() {
        // kodas
    }

    public void caller() {
        transactionalMethod(); // transakcija nebus sukurta, jei kvietimas viduje tos pačios klasės
    }
}