生产环境直接加字段引发锁表:一次真实事故的完整复盘
✦
← 金蝶 K3 实战

生产环境直接加字段引发锁表:一次真实事故的完整复盘

楼主:超级管理员 · 2026-11-04 00:33 · 浏览 20

金蝶 二开 加字段 锁表 生产事故
超级管理员 楼主

生产环境直接加字段引发锁表:一次真实事故的完整复盘

金蝶云社区里有个案例被反复提起:生产环境直接给单据加字段,引发锁表阻塞。这不是理论风险,是真实事故。

事故是怎么发生的

业务方临时提了一个需求,要在单据上增加一个标记字段。开发觉得简单,直接在生产的元数据里加了字段,没走变更流程、没在测试环境验证、没挑时间窗口。

结果加字段触发了表结构变更,大表上的 DDL 持有排他锁,等待的会话越积越多,整个单据模块的读写全部阻塞。前端表现为转圈,后端日志里全是锁等待超时。

根因不在技术,在流程

加字段这个动作本身没有技术难度。问题在于三件事同时缺失:

一,没有变更窗口。生产环境的表结构变更必须放在业务低峰,且要提前通知。

二,没有测试环境验证。字段加在测试库上跑一遍,能提前发现依赖这个表的视图、报表、插件会不会报错。

三,没有回滚预案。字段加上去了,出问题想撤,得再执行一次 DDL,而这时候系统已经在阻塞状态,撤的难度更大。

正确的做法

先在测试环境加字段,跑一遍完整的业务链路:单据录入、提交、审核、下推、报表查询。重点看自定义报表与插件,这两处最容易因为字段变化而崩。

确认无问题后,评估表的数据量。大表的 DDL 要单独排窗口,必要时用在线变更工具或者先在备库操作再切换。

执行时盯着数据库的锁等待视图,一旦出现长事务立刻中止。

给做二开的人一句提醒

金蝶的二开生态很成熟,社区里有大量反面案例,包括 view.close() 导致的 OOM、DataSet 循环里做长时间处理、PostgreSQL 关联更新的语法陷阱。这些案例的共同点都是“本地跑得好,生产上出事”。

本地数据量小、并发低、没人同时操作,这三个条件在生产环境全部不成立。任何涉及表结构、批处理、循环内 IO 的改动,都必须按生产标准验证。

流程比技术重要

这次事故之后,那家企业的做法是把生产环境的 DDL 权限收归 DBA,开发只能提变更单。听起来低效,但比再来一次全模块阻塞便宜得多。

生产环境直接加字段引发锁表:一次真实事故的完整复盘 示意图


本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。

青衫未眠

加字段本身没有技术难度,炸的是三件事同时缺:没有变更窗口、没有测试环境验证、没有回滚预案。加字段会触发DDL排他锁,大表上等待会话越积越多,整模块读写全阻塞。正确做法是先测环境跑完整链路,重点看自定义报表和插件;大表单独排窗口;执行时盯锁等待视图。DDL权限收归DBA这个收尾是合理的。

路人0942

这个复盘的关键是三件事同时缺,单缺一件都还有救。我们吃过类似的亏,加字段把两千万行的单据表锁了十几分钟。后来 DDL 走变更单,大表先用影子表验证,执行时旁边开一个锁等待的监控页面。

路人1067

这坑我也踩过,DDL 在大表上拿排他锁,等待会话一累积前端就转圈。加字段本身没难度,难在流程:没走变更、没在测试验、没挑窗口。建议大表加字段一律走 online DDL 设超时,生产变更前先在影子库跑一遍,锁等待超阈值自动回滚,别靠人盯着。

登录 后参与回复