Self-invocation bypasses the proxy, ignoring transaction management.
In Spring, transactional methods rely on proxies for transaction management. If a method in a @Service class calls another method in the same class, the proxy is bypassed, and the transaction management annotations like @Transactional don't apply. For instance, if methodA() calls methodB(), and methodB() is annotated with @Transactional, the transaction won't be applied unless both methods are called from outside the class.
Additional Notes
Why does transaction self-invocation in @Service matter in practice?