What Happens When You Use @Transactional?
When you annotate a method with @Transactional, Spring creates a proxy class for the annotated class. This proxy class intercepts external method calls and applies transaction behaviors to them.
Proxy Class Interception
The proxy class contains an implementation of the methods declared in the annotated class. When an external method call is made, it is redirected to the proxy class instead of the original class. The proxy class can then perform any necessary pre- and post-processing around the method call, including transaction management.
Self-Invocation Considerations
Spring's transaction management mechanism only intercepts external method calls. This means that self-invocation, where a method within the target object calls another method in the same object, will not automatically start a transaction. This is due to the fact that self-invocation bypasses the proxy mechanism.
Visible Proxy Class
The generated proxy class can be viewed using reflection. You can access its information by introspecting the target class and retrieving its declared classes. The proxy class is typically suffixed with "$Proxy".
Why External Calls Only?
The reason why only external method calls are under transaction is to avoid infinite recursion. If self-invocation also started transactions, it could lead to a situation where a method starts a new transaction, then calls itself and starts another transaction, and so on, creating an endless loop.
The above is the detailed content of How Does Spring's @Transactional Annotation Manage Transactions and Why Doesn't It Work with Self-Invocations?. For more information, please follow other related articles on the PHP Chinese website!