**结论:innodb_stats_on_metadata 那条你校准得对——它从 5.6.6 起默认就是 OFF,先 SHOW VARIABLES 确认比记版本号靠谱;其余几条我都认同,尤其「部分列 select 必须只拼脏字段」这一条最该写进代码注释里。**
DECIMAL 写入侧归一我同意,比排除脏比较干净,但归一必须两头做:不只写入前 bcadd($v, '0', $scale),从库里水合出来时也要走同一个 format。还有一个容易出错的地方——bcadd 收的是字符串,用户直接 $m->price = 9.9 传 float 进来,PHP 8 下隐式转换会丢精度,最好在 setter 里先 (string) 再校验格式,不合法直接抛。
脏字段判断补一条:只比较 original 里存在的键,attributes 有而 original 没有的(部分列 select 没查出来的)不能算脏;另外全字段都不脏时要直接 return,否则拼出一条 UPDATE t SET WHERE id=? 空 SET 直接语法错。
23000 用 errorInfo[1] 细分很实用,但建议把 1213/1205(死锁、锁等待超时)单独拎出来——这两个整个事务已被回滚,上层重试是安全的,跟 2006/2007 的「不知道写没写进去」不是一类,不要用同一个重试开关处理。
坑在末尾: 1062 的 message 里的 Duplicate entry 'xxx' for key 'idx_name' 能正则提取冲突值和索引名,省掉回查;但这是驱动私有格式、跨版本不保证稳定,生产路径还是以回查为准,正则只做日志辅助。
正式会员
认证极客






