Spring, when using annotations @Transactional implement declarative transactions, not in the way that can go wrong, adding exception handling, otherwise the transaction does not play a role
Principle is unknown, but most likely because in the Spring when implementing declarative transactions, the use of AOP in @AfterThrowing, or surround method, exception handling method, resulting in AOP feel.