Azure SQL数据库执行EF迁移中CREATE PROCEDURE时出现过量锁问题
问题分析与解答
为何已完成的EF迁移仍会触发CREATE PROCEDURE相关锁?
- EF Core的自动迁移/自动检查机制是核心诱因:如果应用启动时配置了
context.Database.Migrate(),每个实例启动都会检查数据库迁移状态——哪怕迁移已标记完成。这个检查过程中,EF会验证存储过程等对象的存在性,虽不会真的执行创建,但高负载下多实例同时触发检查,会积累大量元数据锁(比如SCH_M、SCH_S锁),和你看到的多类型锁对应。 - 迁移脚本幂等性缺失:若迁移里的
CREATE PROCEDURE未加IF NOT EXISTS判断,一旦之前的迁移因异常中断却被手动标记为完成(但存储过程实际未创建),应用或运维工具可能重复执行脚本,触发真实创建操作并产生锁。
导致存储过程重复创建的其他原因
- CI/CD配置错误:部署流水线未绑定迁移版本,每次部署全量运行所有迁移脚本,而非仅执行未完成的迁移。
- 代码中的手动触发逻辑:应用自定义初始化逻辑(比如请求级初始化、定时任务)中存在调用存储过程创建的代码,高负载下被重复执行。
- 数据库对象异常:存储过程因权限问题被误删,或元数据损坏,EF迁移检查会判定对象不存在,尝试重新创建。
这是否是干扰信息?
不是干扰信息。这些锁是真实存在的资源占用,高负载下会加剧阻塞,甚至引发业务查询超时——哪怕没有真的执行CREATE PROCEDURE,元数据锁的积累也会拖慢数据库并发性能。
内容的提问来源于stack exchange,提问作者Andrew Velez
相关产品推荐
相关产品推荐

