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 在测试库上执行)。