MySQL事务控制无障碍设计指南
|
跟产品吵。昨天下午三点,我盯着PRD里那行“事务必须全程无障碍,支持任意中断重试”,手抖着把咖啡泼在键盘上——不是因为生气,是那个后端小哥刚换的紫色充电线,插在USB-C口里歪了十五度,我怕他一碰就把整张工位震出事务隔离级别泄露。 我原以为是数据库配置没开XA,结果连看三遍binlog_rows_query_log_events都没关,最后发现是他本地MySQL 8.0.33启用了transaction_allow_batching——对,就是那个默认false、文档里写了“仅供测试”的flag。我敢打包票,他压根没查过commit_timeout的默认值是六十秒,而他前端PM写的“三秒无响应自动切兜底页”,正巧卡在59.8秒回滚前一帧触发了乐观锁重试风暴。优胜劣汰?对,淘汰的是那个连autocommit=0和SET SESSION TRANSACTION ISOLATION LEVEL都抄错三次的实习生,不是代码。 Lighthouse跑分截图发到群里没人回。桌面那个没关的录屏还在录,左下角时间戳停在14:47:02,光标悬停在SHOW ENGINE INNODB STATUS的TRANSACTIONS section上,第17个trx_state是LOCK WAIT,但waiting thread id根本不在PROCESSLIST里——这说明什么?说明它被kill -9了,但ibdata1里的undo log还没刷盘。我懒得讲MVCC,我就说一句:你commit失败后retry三次,第三次拿的read view,比第一次还老两拍。
文章配图,仅供参考 谁去倒水?前端小李,穿灰卫衣那个,刚用useTransition把loading遮罩从0.3秒调成0.35秒,顺手把fetch API包装成try/catch套嵌三层再加个timeout,结果transaction timeout设的是120秒,他fetch超时写的是8000毫秒。所以用户点提交按钮的第七秒,UI显示“操作中”,数据库早把他的session杀干净了,还在等lock wait——lock wait等的是另一个已死连接留下的gap lock。这个我说不准是不是InnoDB bug,但我知道他commit语句后面那个分号是半角,IDE没报错,MySQL parser也吃了,可prepareStatement传参时多塞了个null,于是整个事务隐式转成autocommit模式,还他妈没报warning。 CDN账单上周涨了三百七十二 KB。不是缓存命中率问题,是那个“无障碍事务日志”接口返回的JSON里,把rollback_reason字段从string改成object之后,前端忘了删掉之前硬编码的".reason",于是渲染时报错,错误边界里又触发了一次空数据提交……空提交,懂吧?INSERT INTO audit_log VALUES(),主键自增+1,binlog里记了,但业务逻辑毛都没干。就这么一条,跑满一小时,日志膨胀十八毫秒延迟,比我们当年手工parse relay-log还费CPU。 我见过最荒诞的:产品经理提需求说“要像微信转账一样,断网也能提交”,后端真写了本地IndexedDB先存再同步,还配了个带versionstamp的merge策略——结果sync handler里BEGIN; INSERT; UPDATE; COMMIT; 全套塞进一个Promise.then链,没加await。浏览器进程被系统回收前,只执行了INSERT,UPDATE挂在microtask队列第三位,永远等不到。现在他们的rollback补丁是轮询localForage看有没有未完成标记……靠,这是在搞分布式事务还是搞行为艺术? KPI折算表里,事务成功率指标占权重12%,但他们把“客户端主动cancel”算作失败,把“服务端因OOM被systemd kill”算作成功——就因为后者在监控里有status=200的日志条目。我指着grafana面板问运维,他说:“哦,那个是健康检查探针的返回。” 我没说话,把手里那杯凉透的美式倒进绿植盆里,土面瞬间鼓起三四个气泡,像极了undo log里没清理的roll_ptr。 所以别跟我扯ACID。ACID是教科书写的,现实里只有三种人:一种人在START TRANSACTION前先SELECT @@tx_isolation;一种人把事务当函数式编程写,全用lambda包裹,然后发现Lambda冷启动延迟超过innodb_lock_wait_timeout;还有一种,比如坐我对面那个戴蓝牙耳机的,正一边听《高效能人士的七个习惯》有声书,一边在@Transactional(timeout = 30)里硬塞了三个HTTP远程调用。他提交的那一刻,其实已经输了——不是输在SQL,是输在居然相信“无障碍”这三个字还能落在MySQL身上。 我现在就去把config/my.cnf里那个transaction_allow_batching=true注释掉。顺手把桌面录屏关了,左下角时间停在14:47:03。至于那根紫色充电线?我没动。它歪得刚好,让所有人路过工位都多看一眼——就像我们当年用slow_query_log里那个# Time: 20251014 14:47:02 行,倒推生产事故源头那样。看多了,自然就懂什么叫优胜劣汰。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

