JAVA_IIBRARY Telegram 1744
Аннотация @Transactional не работает, когда ты вызываешь метод из другого метода в том же классе?

Это не баг, а классическая особенность Spring AOP по дизайну.

Знаешь, почему транзакция вообще не стартует?

Проблема в том, как Spring AOP создаёт прокси. Когда ты ставишь @Transactional на метод, Spring не правит байткод класса. Вместо этого он создаёт прокси-объект, который оборачивает твой бин.

Этот прокси перехватывает внешние вызовы метода, запускает транзакцию и потом делегирует вызов реальному методу бина.

Это отлично работает, когда внешний бин вызывает твой публичный транзакционный метод, потому что вызов проходит через прокси.

Но при самовызове внутри класса (например, this.someTransactionalMethod()) ты вызываешь метод напрямую на целевом объекте (this), а не через прокси. Транзакционный advice прокси полностью обходится, поэтому транзакция не стартует. Это фундаментальное следствие прокси-based AOP.

Чтобы исправить, самое чистое и продакшен-готовое решение это вынести транзакционный метод в отдельный Spring-бин и инжектить его. Тогда вызов всегда будет внешним и пройдёт через прокси, корректно поднимая транзакцию каждый раз. 🙈

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93



tgoop.com/Java_Iibrary/1744
Create:
Last Update:

Аннотация @Transactional не работает, когда ты вызываешь метод из другого метода в том же классе?

Это не баг, а классическая особенность Spring AOP по дизайну.

Знаешь, почему транзакция вообще не стартует?

Проблема в том, как Spring AOP создаёт прокси. Когда ты ставишь @Transactional на метод, Spring не правит байткод класса. Вместо этого он создаёт прокси-объект, который оборачивает твой бин.

Этот прокси перехватывает внешние вызовы метода, запускает транзакцию и потом делегирует вызов реальному методу бина.

Это отлично работает, когда внешний бин вызывает твой публичный транзакционный метод, потому что вызов проходит через прокси.

Но при самовызове внутри класса (например, this.someTransactionalMethod()) ты вызываешь метод напрямую на целевом объекте (this), а не через прокси. Транзакционный advice прокси полностью обходится, поэтому транзакция не стартует. Это фундаментальное следствие прокси-based AOP.

Чтобы исправить, самое чистое и продакшен-готовое решение это вынести транзакционный метод в отдельный Spring-бин и инжектить его. Тогда вызов всегда будет внешним и пройдёт через прокси, корректно поднимая транзакцию каждый раз. 🙈

👉 Java Portal

BY Java Portal | Программирование




Share with your friend now:
tgoop.com/Java_Iibrary/1744

View MORE
Open in Telegram


Telegram News

Date: |

Telegram has announced a number of measures aiming to tackle the spread of disinformation through its platform in Brazil. These features are part of an agreement between the platform and the country's authorities ahead of the elections in October. Commenting about the court's concerns about the spread of false information related to the elections, Minister Fachin noted Brazil is "facing circumstances that could put Brazil's democracy at risk." During the meeting, the information technology secretary at the TSE, Julio Valente, put forward a list of requests the court believes will disinformation. Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. The optimal dimension of the avatar on Telegram is 512px by 512px, and it’s recommended to use PNG format to deliver an unpixelated avatar. The best encrypted messaging apps
from us


Telegram Java Portal | Программирование
FROM American