配置项变更必须通过插入而非更新实现,使用version和effective_at双字段控制生命周期,确保可追溯、可回滚、可灰度;version建议用自增BIGINT或语义化字符串,effective_at表示生效时间且需唯一索引约束。
配置项变更必须带版本号和生效时间
直接在配置表里 UPDATE 会导致历史不可追溯、回滚困难、灰度验证缺失。所有写入必须走插入,用 version + effective_at(datetime)双字段控制生命周期。
-
version建议用BIGINT AUTO_INCREMENT或语义化字符串(如'v1.2.0'),避免用时间戳——并发插入可能乱序 -
effective_at存的是「该版本从何时开始生效」,不是「何时写入」;可设默认值CURRENT_TIMESTAMP,但必须允许手动覆盖 - 加唯一索引:
UNIQUE KEY uk_config_key_version (config_key, version),防重复发布
查询最新生效配置要绕开 MAX(version) 子查询
用 SELECT ... WHERE effective_at 是常见错误——它依赖「最后发布的一定是最新的」,但实际可能有延迟发布(比如预设下周一生效的版本)。
- 正确做法是:先查出所有
effective_at 的记录,再取version最大的那条,即:SELECT * FROM config_versions WHERE config_key = 'app.timeout' AND effective_at <= NOW() ORDER BY version DESC LIMIT 1;
- 务必给
(config_key, effective_at)加联合索引,否则大表会全扫 - 如果业务要求「严格按发布时间生效」,
version字段建议改用BIGINT自增,避免语义版本排序错乱(v10.0v2.0)
上线前必须校验配置版本冲突与空窗期
运维脚本或发布平台在插入新版本前,应主动检查两件事:是否存在未生效的旧版本重叠、是否存在生效时间断层。