TGViewer
Java Geek Java Geek @java_geek · 2.37K subscribers
Post #373 1.26K
🧠 Почему @Transactional не работает в private-методах?

В Spring @Transactional работает через прокси. Это значит, что Spring оборачивает бин в обёртку, которая и управляет транзакцией. Но есть важный нюанс:

📌 Прокси перехватывает только ВНЕШНИЕ вызовы метода.

Если вы вызываете @Transactional-метод изнутри того же класса, транзакция не начнётся.

Пример:


@Service
public class UserService {

public void createUser() {
// вызов внутреннего метода — транзакция не активируется
saveUser();
}

@Transactional
private void saveUser() {
// НЕ будет работать как транзакционный
}
}


💡 Даже если вы сделаете метод public, но вызов будет из того же класса — эффект тот же: Spring-прокси его не "перехватит".

⚠️ Аннотация @Transactional не работает на private-методах вообще. Прокси просто не может их подменить.

✅ Правильный подход:
Вынесите транзакционный метод в отдельный бин:


@Service
public class UserSaver {

@Transactional
public void saveUser() {
// теперь работает!
}
}


И используйте его из другого бина:


@Service
public class UserService {
private final UserSaver userSaver;

public UserService(UserSaver userSaver) {
this.userSaver = userSaver;
}

public void createUser() {
userSaver.saveUser(); // транзакция начнётся
}
}


📌 Или используйте аспектно-ориентированную реализацию с @EnableAspectJAutoProxy(exposeProxy = true) + AopContext.currentProxy(), но это уже хардкор.

👉 @java_geek
  • 👍 5
  • ❤ 1
More from @java_geek
  1. Sep 24, 2026Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в…
  2. Sep 17, 2026Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Д…
  3. Sep 15, 2026Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от сп…
  4. Sep 11, 2026Какова цель ключевого слова final, когда оно используется с переменной? Ключевое слово fin…
  5. Sep 9, 2026☕ Java Tip: Как работает var в Java С версии Java 10 появился ключевое слово var. Оно упро…
  6. Sep 7, 2026Что такое перегрузка методов в Java? Перегрузка методов — это мощный приём, который позвол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →