跳到主要内容

凌晨三点,死锁,和那三千尾款

接单小蒋
接单小蒋

· 阅读约 3 分钟

手机在床头震的时候我以为是甲方。摸起来一看是监控告警,说实话那一秒还有点高兴,觉得这钱花得值。

七月那单,给本地一个建材市场做的小程序,一万二,对接他们那套用了七八年的老 ERP。我这头每天凌晨两点跑个对账任务,把前一天的订单拉过来核一遍,只读账号,不敢碰他们的写入。前五天都好好的。第六天凌晨,任务挂了。

报错就一行:

ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction

我第一反应是重试呗,谁写数据库不加两次重试。加完还是死,而且死得更彻底,两条事务互相等,谁也不松手。三点二十,甲方真打电话来了,说后台订单页一片空白,问是不是我把他数据搞没了。我说没有我在看,其实我屏幕上什么也没有,就一个光秃秃的报错。

爬起来开电脑,客厅灯一开,猫从沙发上跳下来跟我进书房,以为我要喂它。我倒杯水坐下,把日志从两点往下拉。

查到四点才明白,两个毛病叠一块了。一个是跨零点:任务取的是“昨天”,但我那个重试逻辑一旦重跑,取的就是当天了,因为系统时间已经过零点。ERP 那边时间字段还是个字符串,2026-07-14 23:58:00 这种,我这边按 UTC 去解析,正好错八小时。说白了这活儿从第一天就在拿错数据,只是前面几天错的那批恰好是空的,没人发现,我也不可能发现。

另一个就是死锁,重试把两条事务并着跑起来了,各自攥着一半的锁等对方放。

修起来倒不快不慢。日期窗口改成跑批开始那一刻算好、当参数传下去,重试也带同一个参数;ERP 那串时间当成没时区的处理,不再瞎转;重试从并发改成排队,一条一条来。改完四点半,验证又跑到五点。天都亮了。

甲方早上八点发微信,说页面好了。然后就没有然后了。尾款三千,我提了两次,第一次说财务在走流程,第二次他已读不回。

这账其实不难算,但算出来难看。工具成本一年一百多,忽略不计;熬一个通宵,按我平时报价折,两千块上下。真正贵的是那三千尾款搁了三个月,说白了有一部分就是白干。还有一笔没算进去的——我原本约了另一个甲方周四上午看需求,五点半我发消息改到下周,那边后来就没声了。这单黄了怪不了别人。

我不是说监控不好用,监控是好用的,问题是它半夜响。凌晨那通电话挂了以后我在书房坐了十分钟没动,不是困,是烦,烦那种“白天测得好好的”的自信被人一巴掌打醒的感觉。

后来我把这套对账的逻辑抽出来做成了模板,最近接的两个单直接套,省了我两个晚上。这算是那晚唯一的收获,虽然我并不想承认是被甲方打出来的。

这单我报一万二,改完那一版等于白送他们一个通宵。甲方爸爸的逻辑很简单:你修好了,说明本来就不该坏。

接单小蒋
接单小蒋

自由职业接外包。技术是工具,交付是本事,账要算明白。

查看主页 →