You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@EnableTransactionManagement是否默认开启?未标注仍触发事务异常排查

问题

我在应用中未添加@EnableTransactionManagement注解(已多次确认),但如果不为服务方法标注org.springframework.transaction.annotation.Transactional注解,调用数据操作时仍会抛出jakarta.persistence.TransactionRequiredException异常。请问@EnableTransactionManagement是否默认开启?我遗漏了什么配置?

代码示例

Repository实现类

@Repository
public class PersistencePostgresImpl implements Persistence {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void saveUser(User user) {
        DbUserEntity entity = em.find(DbUserEntity.class, user.getUserUID());
        if(entity == null){
            throw new UserNotFoundException(user.getUserUID());
        }

        entity.setLoginName(user.getAccessData().getUserName());
        entity.setUserData(user);
    }
}

Service类

@Service
public class UserService {

    @Inject
    private Persistence persistence;

    @Transactional
    public void updateUserData(User user) {
       persistence.saveUser(user);
    }
}

配置类

@Configuration
@PropertySource(value = "classpath:persistence.properties")
public class PersistenceConfiguration {
}

persistence.properties

spring.datasource.url=... 
spring.datasource.username=...
spring.datasource.password=...

环境信息

  • Spring Boot: 3.2.1
  • Hibernate: 6.4.1

pom.xml依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>
回答
  1. @EnableTransactionManagement确实默认开启
    当你引入spring-boot-starter-data-jpa依赖时,Spring Boot的自动配置类JpaBaseConfiguration已经隐式启用了事务管理,等同于帮你添加了@EnableTransactionManagement注解,所以你不需要手动声明,事务管理功能已经生效。

  2. 必须标注@Transactional的原因
    你的saveUser方法里,通过EntityManager查询到实体后修改属性属于实体脏写操作。Hibernate只会在事务提交阶段才会把这些修改同步到数据库,如果没有事务上下文,EntityManager处于非事务状态,此时执行脏写操作必然抛出TransactionRequiredException——简单说就是没有事务的话,Hibernate不知道什么时候该把修改持久化到数据库,直接报错。

  3. 你没有遗漏关键配置
    你的配置已经满足Spring Boot JPA的基础要求:数据源配置正确、引入了JPA starter依赖、Repository和Service能被Spring扫描管理。核心问题是对事务生效逻辑的理解:事务管理功能是开着的,但具体方法需要通过@Transactional声明事务边界,才能让EntityManager在事务上下文内正常工作。

如果想简化注解使用,可以考虑:

  • 在类级别添加@Transactional,让该类下所有方法都受事务管理
  • 不建议随意修改Spring Boot的事务默认配置,按需添加注解逻辑更清晰

内容的提问来源于stack exchange,提问作者devops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:17:07