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,可以通过两种方式实现:
- 直接在DAO层的
@Transactional注解里指定名称:@Transactional("jpaTransactionManager") - 全局配置JPA Repository的默认事务管理器:在
@EnableJpaRepositories注解中通过transactionManagerRef属性指定,示例如下:
@EnableJpaRepositories(basePackages = ["你的DAO包路径"], transactionManagerRef = "jpaTransactionManager")
内容的提问来源于stack exchange,提问作者Sekojuku
相关产品推荐
相关产品推荐

