SpringBoot集成Flyway迁移SQLServer失败:缺少sp_getapplock的@LockMode参数
解决Flyway在SQL Server中获取应用锁失败的问题
核心问题分析
你遇到的错误Procedure or function 'sp_getapplock' expects parameter '@LockMode', which was not supplied,尽管代码中明确传入了@LockMode参数,大概率是以下几个原因导致:
- Flyway组件版本不一致:你的
flyway-core是10.1.0,但flyway-sqlserver是10.2.0,版本不匹配会引发类加载冲突或逻辑不一致,导致实际执行的SQL并非你看到的代码版本。 - SQL Server驱动版本问题:你使用的
mssql-jdbc是预览版(12.5.0.jre11-preview),预览版可能存在JDBC参数绑定的bug,导致命名参数无法正确传递给存储过程。 - 依赖缓存残留:即使清理了.m2仓库,IDE或构建工具可能仍有缓存的旧版本类文件,导致实际运行的代码并非更新后的版本。
解决方案步骤
1. 统一所有Flyway依赖版本
将所有Flyway相关组件的版本统一为同一个稳定版(比如10.2.0),避免版本不一致带来的冲突:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>10.2.0</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-database-postgresql</artifactId> <version>10.2.0</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-database-oracle</artifactId> <version>10.2.0</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-database-sqlserver</artifactId> <version>10.2.0</version> </dependency>
注意:Flyway从9.x版本开始,SQL Server的驱动artifactId已改为
flyway-database-sqlserver,旧的flyway-sqlserver是过时命名,建议使用新的artifactId。
2. 更换为稳定版SQL Server JDBC驱动
移除预览版驱动,使用最新的稳定版,比如12.4.0.jre11:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.0.jre11</version> </dependency>
3. 彻底清理构建缓存
- 执行Maven命令强制清理并重新构建:
mvn clean install -U
- 如果使用IDE(如IntelliJ IDEA),执行
File -> Invalidate Caches...并重启IDE,确保旧的类文件被完全清除。
4. 检查Flyway配置
确认你的Spring Boot配置中没有自定义覆盖Flyway的锁相关逻辑,保持默认配置即可:
# 避免设置可能干扰锁机制的配置 # flyway.lock-type=...
验证步骤
完成上述修改后,重新启动应用,观察Flyway是否能正常创建flyway_schema_history表并执行迁移。如果仍有问题,可以开启Flyway的DEBUG日志,查看实际执行的SQL语句,确认参数是否正确传递:
logging.level.org.flywaydb=DEBUG
内容的提问来源于stack exchange,提问作者Swat J
相关产品推荐
相关产品推荐

