yeg
2026-09-15 4fff3f4dd9ea9546b8974c4b6970144f691d60fa
refs
用户 yeg <1347747024@qq.com>
星期二, 九月 15, 2026 10:04 +0800
提交者 yeg <1347747024@qq.com>
星期二, 九月 15, 2026 10:04 +0800
提交4fff3f4dd9ea9546b8974c4b6970144f691d60fa
目录 86d7f81caf485d288cf00045a442ff6120ba5de9 目录 | zip | gz
parent 0d9afc5aadbe4dcb1b934523d7bf90c834fad407 查看 | 对比
fix(merchant): DDL 等锁必须有上限,否则一次加列就能拖垮整个后台

2026-09-15 上午后台全站不可用(所有页面加载到超时)。根因是启动时补列的 ALTER 永久等锁:

conn 201 SHARED_READ (GRANTED) 空闲未提交事务,已持有 280 秒,trx_query = NULL
conn 202 EXCLUSIVE (PENDING) alter table merchant_onboarding_application
add column settlement_card_front_url ...
其余会话 SHARED_READ (PENDING) 全部排队

ALTER 拿不到排他元数据锁就无限期等待,而该表上所有后续查询也跟着排队,
最终借光 Hikari 连接池,健康检查都超时。kill 掉持锁事务后立即恢复,列也补上了。

改动:
- MerchantOnboardingSchemaInitializer 新增 addColumn():先 set session lock_wait_timeout = 5,
拿不到锁就放弃这一列并记日志,让应用照常启动(缺列只影响重试功能,不该赔上整个服务)。
用 SET SESSION 而不是 JDBC 参数,避免依赖连接串是否带 allowMultiQueries。
- 补 V143 迁移,把 settlement_card_front_url 纳入迁移链(开发库由上面的初始化器补)。

注意:迁移里**不能**写 dd column if not exists——那是 MariaDB 扩展,
MySQL 8.0.36 会报 ERROR 1064(本机实测确认),迁移只执行一次本也不需要。

回归:MerchantOnboardingRetryTests / MerchantOnboardingRetryReleaseTests /
MerchantSettlementCallbackIdempotencyTests 共 12 项通过(含 V143 在测试库上执行)。
1个文件已添加
1个文件已修改
50 ■■■■■ 已修改文件
talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantOnboardingSchemaInitializer.java 39 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/main/resources/db/migration/V143__merchant_onboarding_settlement_card_front_url.sql 11 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史