Common Reasons Why Spring @Transactional May Not Work

This article explains several typical pitfalls that cause Spring's @Transactional annotation to be ineffective, such as unsupported database engines, unmanaged service beans, internal method calls, non‑public methods, default rollback rules, and missing transaction manager configuration, and provides practical solutions for each case.

Full-Stack Internet Architecture
Full-Stack Internet Architecture
Full-Stack Internet Architecture
Common Reasons Why Spring @Transactional May Not Work

0x01: Database does not support transactions – Transactions only work with databases that support them; for example, using MySQL with the MyISAM engine disables transactions, while switching to InnoDB enables them.

0x02: Service class not managed by Spring – Spring’s transaction management relies on AOP; if the service class is not a Spring bean, the @Transactional annotation has no effect.

0x03: Internal method calls – Calling a transactional method from another method within the same class using this.xxx() bypasses the proxy, so the transaction is not applied. A common fix is to split the class so that the call goes through a Spring‑managed bean.

Example implementation:

@Service
public class OrderServiceImpl implements OrderService {
    public void update(Order order) {
        updateOrder(order);
    }

    @Transactional
    public void updateOrder(Order order) {
        // update order
    }
}

0x04: Default rollback behavior – Spring rolls back only on unchecked exceptions (RuntimeException). Checked exceptions such as IOException are not rolled back unless you specify rollbackFor = Exception.class.

0x05: Transactional annotation works only on public methods – Applying @Transactional to protected, private, or package‑private methods is ignored without any error.

0x06: Data source lacks a transaction manager – Without a configured PlatformTransactionManager, all transaction annotations are ineffective. Define a bean such as:

@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

In summary, to ensure Spring transactions function correctly, use a transaction‑supporting database engine, make service classes Spring beans, avoid internal self‑calls, annotate only public methods, configure rollback for checked exceptions when needed, and provide a proper transaction manager bean.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

BackendJavatransactionaopdatabasespring
Full-Stack Internet Architecture
Written by

Full-Stack Internet Architecture

Introducing full-stack Internet architecture technologies centered on Java

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.