Ignite从2.7升级至2.10.0后H2报"LOCK_MODE"函数不存在异常
问题根因
Ignite 2.8及以上版本对内置H2数据库做了定制改造,新增了LOCK_MODE()等自定义函数来适配自身持久化逻辑,而官方原版H2无此函数。你升级Ignite到2.10后出现了依赖冲突:Ignite内置的定制H2和pom中显式声明的官方H2同时存在,类加载时优先加载了官方版本H2,导致Ignite调用自定义函数时找不到实现,触发报错。
解决方案
- 方案一:统一使用Ignite内置的定制版H2。排除项目中所有非Ignite来源的H2依赖(包括Spring Boot默认传递引入的H2、其他第三方依赖引入的H2),无需单独声明H2版本,直接使用Ignite传递引入的1.4.200-patched版本即可。改完后可执行
mvn dependency:tree | grep h2检查依赖树,确认无多版本H2冲突。 - 方案二:如果项目必须使用官方版H2,可在Hikari连接池配置中显式指定事务隔离级别,避免触发
LOCK_MODE()调用。新增配置项:hikari.data-source-properties.isolation-level = TRANSACTION_READ_COMMITTED,指定隔离级别后Hikari不会主动调用H2连接的getTransactionIsolation()方法,不会触发该函数查询。 - 方案三:将H2版本降级到1.4.196,该版本官方H2自带
LOCK_MODE()函数的兼容实现,无需依赖Ignite定制版即可兼容调用。
内容的提问来源于stack exchange,提问作者Chanel
相关产品推荐
相关产品推荐

