使用 spring R2DBC 连接 mySQL 服务器版本 8 时出现未知系统变量 'tx_isolation'

Unknown system variable 'tx_isolation' when using spring R2DBC to connect with a mySQL server version 8

我使用 IntelliJ Idea 的 spring 初始化程序创建了一个新的 spring 引导项目,并检查了 Web/Spring reactive WebSQL/Spring data R2DBC 依赖项。

我还为 MySQL

添加了对 R2DBC 实现的依赖
        <dependency>
            <groupId>dev.miku</groupId>
            <artifactId>r2dbc-mysql</artifactId>
            <version>0.8.2.RELEASE</version>
        </dependency>

和java连接器

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

从控制台询问 MySQL 服务器的版本 select version(); 我得到 8.0.17

连接工厂配置是这样的:

@Configuration
@RequiredArgsConstructor
public class R2dbcConfig extends AbstractR2dbcConfiguration {

    @Bean
    public ConnectionFactory connectionFactory() {
        ConnectionFactoryOptions conf = ConnectionFactoryOptions.builder()
                .option(DRIVER, "mysql")
                .option(HOST, "the.db.url")
                .option(PORT, 33066612)
                .option(USER, "myUserName")
                .option(PASSWORD, "myPassword")
                .option(DATABASE, "aDbName")
                .build();
        return ConnectionFactories.find(conf);
    }
}

然而,当我 运行 应用程序时,我得到以下异常

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'
Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'

类似问题的答案指示提问者将 mysql:mysql-connector-java 的版本更新为 8.+,根据 IntelliJ,maven 解析的版本是 8.0.26。 奇怪的是,如果我删除连接器依赖项,结果是完全一样的。

因此,我调试了 R2DBC 实现以了解发生了什么,我发现在握手期间,dev.miku.r2dbc.mysq.QueryFlow#initHandshake 方法收到一条 HandshakeRequest 消息,其中 headers 告诉服务器版本是“5.5.30”。这导致 R2DBC 实现使用旧的“tx_isolation”系统变量名称而不是新的“transaction_isolation”。

为什么? 我错过了什么?

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html 说:

The tx_isolation and tx_read_only system variables have been removed. Use transaction_isolation and transaction_read_only instead.

您检查发现服务器版本为8.0.17。这比握手消息更权威。

我建议在您的类路径中搜索旧版本连接器的任何剩余 jar 文件。您可能同时拥有 8.0.26 版本的连接器和尚未更新为使用新选项名称的旧版本。

你能解决吗?我发现 R2dbc mysql 驱动程序没有得到我的 MySql 版本,因为它会检查它以询问 tx_isolation 或 transaction_isolation.

我得到的解决方案是将驱动程序更改为 Jasync。

//DB
implementation("com.github.jasync-sql:jasync-r2dbc-mysql:2.0.4")
implementation("io.r2dbc:r2dbc-h2")
implementation("org.springframework.boot:spring-boot-starter-data-r2dbc:2.6.0")

我的配置:

@Configuration
@EnableTransactionManagement
@EnableConfigurationProperties(DbPropertiesConfig::class)
class DataSourceConfiguration {
@Configuration
    class ProdMySQLConfiguration(@Autowired val dbPropertiesConfig: DbPropertiesConfig) : AbstractR2dbcConfiguration() {

        @Bean
        override fun connectionFactory(): ConnectionFactory =
                JasyncConnectionFactory(MySQLConnectionFactory(
                        com.github.jasync.sql.db.Configuration(
                                database = dbPropertiesConfig.db,
                                port = dbPropertiesConfig.port,
                                username = dbPropertiesConfig.username,
                                host = dbPropertiesConfig.host,
                                password = dbPropertiesConfig.password
                        )
                ))
    }

}

考虑到我的 yml 中有 DbPropertiesConfig。

Doc/Example: Doc Example

抖音:https://gitter.im/jasync-sql/support