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

使用Postgres+Exposed+Ktor+JDBC建表时遇事务隔离级别4不支持错误

解决PostgreSQL + Exposed 事务隔离级别不支持的错误

这个错误的核心原因很明确:你用的PostgreSQL JDBC驱动版本太老了(9.0-801.jdbc4),而Exposed默认使用的事务隔离级别是SERIALIZABLE(对应级别4),这个老版本驱动并不支持这个级别,所以抛出了Transaction isolation level 4 not supported的异常。

下面是两种可行的解决方案:

方案一:升级PostgreSQL JDBC驱动(推荐)

老版本的JDBC驱动不仅不支持新的事务隔离级别,还可能存在安全漏洞和兼容性问题,直接升级到最新稳定版是最优选择。

修改你的build.gradle中的依赖:

// 替换成最新的PostgreSQL JDBC驱动版本,比如42.6.0(可根据实际情况调整)
implementation group: 'org.postgresql', name: 'postgresql', version: '42.6.0'

注意:新版驱动的groupId从postgresql改成了org.postgresql,别写错了。

方案二:手动指定Exposed支持的事务隔离级别

如果暂时无法升级驱动,你可以修改Exposed的事务隔离级别,改成老驱动支持的READ COMMITTED(这也是PostgreSQL的默认隔离级别)。

修改你的Hello.kt代码,在创建事务时指定隔离级别:

object Pays : Table() {
    val id = integer("id").autoIncrement().primaryKey()
    val name = varchar("name", 50)
}

fun main(args: Array<String>) {
    Database.connect(
        url = "jdbc:postgresql://localhost/my_db",
        driver = "org.postgresql.Driver",
        user = "user",
        password = "password"
    )

    // 手动指定事务隔离级别为READ COMMITTED(级别2)
    transaction(TransactionIsolationLevel.READ_COMMITTED) {
        // 在这里执行你的数据库操作,比如建表
        SchemaUtils.create(Pays)
    }
}

补充说明

  • 事务隔离级别对应关系:READ UNCOMMITTED(1)、READ COMMITTED(2)、REPEATABLE READ(3)、SERIALIZABLE(4)。老版本的PostgreSQL JDBC驱动只支持到级别2或3,不支持级别4。
  • 升级驱动后,Exposed的默认事务隔离级别就能正常工作,不需要额外修改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:14