使用R2DBC、Flyway与JDBC时如何选择正确的TransactionManager
问题与解决方案
环境配置
- micronaut 3.7.2
- micronaut-data 3.8.1, micronaut-data-r2dbc, r2dbc-postgresql 0.9.2
- Flyway 8.5.13, micronaut-jdbc-hikari, micronaut-flyway 5.4.1, postgresql 42.5.0
- testcontainers (jdbc, r2dbc, postgresql) 1.17.5
- io.micronaut.test-resources 3.6.2
测试配置(conf4k)
datasources { default { dialect=POSTGRES options { currentSchema=default } } } r2dbc { datasources { default { dialect=POSTGRES options { currentSchema=default } } } } flyway { datasources { default { enabled=true locations="classpath:databasemigrations" schemas=["default"] create-schemas=true } } } test-resources { containers { postgres { image-name="postgres:12.12" hostnames=["localhost"] } } }
前提条件
为使Flyway与Micronaut Data使用同一数据库及测试容器,两者的数据源需同名。
问题描述
同时使用JDBC与R2DBC时,系统会创建同步和响应式两种TransactionManager Bean,使用@Transactional注解时触发以下错误:
Multiple possible bean candidates found: [io.micronaut.transaction.jdbc.DataSourceTransactionManager, io.micronaut.transaction.sync.SynchronousFromReactiveTransactionManager]
尝试方案
曾考虑使用@TransactionalAdvice解决,但因数据源必须同名而无法实现;修改数据源名称也完全无效。
解决办法
1. 配置默认事务管理器
在配置文件中指定默认使用的事务管理器类,比如优先使用JDBC的同步事务管理器:
micronaut.transaction.default-transaction-manager=io.micronaut.transaction.jdbc.DataSourceTransactionManager
如果需要使用响应式事务管理器,则替换为:
micronaut.transaction.default-transaction-manager=io.micronaut.transaction.sync.SynchronousFromReactiveTransactionManager
2. 用@Qualifier明确指定事务管理器
在使用@Transactional的方法或类上,配合@Qualifier指定具体的事务管理器Bean名称(默认Bean名称为类名首字母小写):
@Transactional @Qualifier("dataSourceTransactionManager") public void yourBusinessMethod() { // 业务逻辑实现 }
若要使用响应式事务管理器,则改为:
@Transactional @Qualifier("synchronousFromReactiveTransactionManager") public void yourReactiveMethod() { // 响应式业务逻辑 }
3. 排除不需要的事务管理器自动配置
如果只需要其中一种事务管理器,可以在配置文件中排除对应的自动配置类:
比如只保留JDBC事务管理器,排除响应式的:
micronaut.context.excludes=[io.micronaut.transaction.sync.SynchronousFromReactiveTransactionManagerAutoConfiguration]
反之,若只需要响应式事务管理器,排除JDBC的:
micronaut.context.excludes=[io.micronaut.transaction.jdbc.DataSourceTransactionManagerAutoConfiguration]
内容的提问来源于stack exchange,提问作者macmillancodes
相关产品推荐
相关产品推荐

