其他人踩的坑
环境说明:MySQL数据库中间件使用的是myhub
电商有一张MySQL表是分表的,的同事在给该表加字段的时候,存在一个阶段是,部分分表已经加字段成功,部分分表还未执行变更。
在该阶段,如果服务执行查询SQL,且SQL的写法为【select * from tab】,MyHub下发SQL到分表执行,会导致MyHub检查到本次查询的字段不一致,已变更的分表比未变更的分表多一个字段,然后抛java.sql.SQLException: Unknown error,会导致SQL和接口报错
我的亲身经历
我在给另一个关联关系表,该表是分表(256张分表),加字段提交到线上的变更的时候,审批的同事问我是否有使用select *的SQL,经过提示,我才意识到可能会踩同样的坑。
如何规避
- MySQL中间件和我们中间件一样存在该漏洞,变更是串行执行,且也会校验字段是否一致
- 要加字段的表是分表设计的
- 针对上述表,有select * 的SQL
同时满足上述3个条件才会踩到这个坑,破坏任一条件都不会踩到这个坑,不过对普通开发来说,可能最好的规避手段就是在分库分表的同事不要使用 select *
TODO: 后面抽空补充我们的表设计,和加字段sql,以及我们规避select * 使用的最佳实践