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

Spring多事务管理器下@Transactional未指定name的生效规则问询

问题描述

项目里有两个事务管理器:

  • 自定义的customTransactionManager,已标注@Primary
  • Spring JPA自动生成的jpaTransactionManager

目前正在将所有实体迁移至JPA,改写DAO层时碰到了嵌套@Transactional的场景,代码示例如下:

业务层实现

@Transactional("jpaTransactionManager")
override fun deleteByIds(ids: List<Int>): Int {

        if (ids.isEmpty()) {
            return 0
        }
        platformsDao.deleteByIdIn(ids)

        log.info { "Was deleted '${ids.size}' platforms" }

        return ids.size
    }

DAO层定义

@Repository
interface PlatformsDao : CrudRepository<PlatformEntity, Int> {

    @Transactional 
    fun deleteByIdIn(ids: List<Int>)

    fun getAllByDisplayNameStartingWith(regex: String): MutableList<PlatformEntity>
}

疑问:DAO层的@Transactional不指定name属性的话,会不会自动使用jpaTransactionManager?


解答

不会自动使用jpaTransactionManager,而是会优先选用标注了@Primary的customTransactionManager。

这是Spring处理多事务管理器的规则:当存在多个事务管理器Bean时,@Primary标记的Bean会成为默认候选实例,在没有显式指定事务管理器名称的情况下,Spring会自动选择它。

如果希望DAO层的@Transactional使用jpaTransactionManager,可以通过两种方式实现:

  1. 直接在DAO层的@Transactional注解里指定名称:@Transactional("jpaTransactionManager")
  2. 全局配置JPA Repository的默认事务管理器:在@EnableJpaRepositories注解中通过transactionManagerRef属性指定,示例如下:
@EnableJpaRepositories(basePackages = ["你的DAO包路径"], transactionManagerRef = "jpaTransactionManager")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:10:29