使用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
相关产品推荐
相关产品推荐

