In Spring, transactional behavior is managed by a proxy. When a method calls another method within the same class, it doesn't go through the proxy, so any @Transactional annotations on the called method are ignored. For instance, if a purchase method in OrderService calls a private method marked with @Transactional, the transaction management won't apply to the private method.
Additional Notes
Why can transaction self-invocation be problematic in Spring?