Spring R2DBC连接MySQL 8.0报Unknown system variable 'tx_isolation'错误求助
问题诱因
dev.miku:r2dbc-mysql的MySQL版本判断逻辑完全独立于JDBC的mysql-connector-java依赖,所以你调整甚至删除该JDBC依赖不会对报错产生任何影响。- 你连接的MySQL前端大概率部署了ProxySQL、HAProxy、云厂商RDS代理这类中间件,这类中间件默认会在连接握手阶段返回自身伪装的MySQL版本号(多数默认伪装为
5.5.30),而非后端真实的MySQL 8.0.17版本号。r2dbc-mysql 0.8.2.RELEASE拿到错误的版本号后,会判定目标为MySQL 5.5版本,自动使用旧版本的事务隔离级别变量名tx_isolation查询,而MySQL 8.0已经移除了该变量,用transaction_isolation替代,最终触发报错。
修复方案(任选其一即可)
方案1:强制指定服务端版本
在R2DBC连接配置中新增serverVersion参数,强制指定真实的MySQL版本,覆盖握手阶段拿到的错误版本号,修改配置如下:
import dev.miku.r2dbc.mysql.constant.ServerVersion; @Configuration @RequiredArgsConstructor public class R2dbcConfig extends AbstractR2dbcConfiguration { @Bean public ConnectionFactory connectionFactory() { ConnectionFactoryOptions conf = ConnectionFactoryOptions.builder() .option(DRIVER, "mysql") .option(HOST, "the.db.url") // 注意修正你配置中的错误端口,这里示例为默认3306,替换为实际端口即可 .option(PORT, 3306) .option(USER, "myUserName") .option(PASSWORD, "myPassword") .option(DATABASE, "aDbName") // 新增强制指定服务端版本配置 .option(Option.valueOf("serverVersion"), ServerVersion.create(8, 0, 17)) .build(); return ConnectionFactories.find(conf); } }
方案2:升级R2DBC MySQL驱动
原dev.miku的R2DBC MySQL驱动已经捐给官方社区维护,新坐标为io.asyncer:r2dbc-mysql,新版本优化了版本识别逻辑,对这类中间件伪装版本的场景容错性更高,直接替换依赖即可:
<!-- 移除原来的dev.miku依赖,替换为官方维护的新版本 --> <dependency> <groupId>io.asyncer</groupId> <artifactId>r2dbc-mysql</artifactId> <version>1.1.3</version> </dependency>
方案3:修改数据库代理配置
如果是你可控的数据库代理,调整代理配置关闭版本号伪装,让握手阶段直接返回后端真实的MySQL 8.0.17版本号即可。
内容的提问来源于stack exchange,提问作者Readren
相关产品推荐
相关产品推荐

