大事务卡死或超时本质是锁和日志拖慢MySQL长事务持续持锁、狂写redo、撑爆undo导致MVCC版本链拉长、查询变慢应拆分为1k5k行/批禁用OFFSET分页改用游标式推进。大事务卡死或超时本质是锁和日志在拖慢你MySQL里一个跑十几分钟的事务不是“慢”而是正在持续持有行锁、表锁同时往ib_logfile里狂写redo日志还可能把undo log撑爆。InnoDB默认事务隔离级别下长事务会让MVCC版本链无限拉长其他查询也跟着变慢。拆分不是为了“看起来快”是为了让锁及时释放、日志可控、回滚不爆炸。别用AUTOCOMMIT0包住整批数据处理——这是最常见误操作单次提交控制在 1k5k 行较稳妥超过 1w 行就得警惕Lock wait timeout exceeded避免在事务里做网络请求、文件读写、复杂计算——这些会把锁持有时长不可控地拉长用 LIMIT WHERE 拆 UPDATE/DELETE别信 OFFSET想分批更新千万级用户状态别写UPDATE users SET status1 ORDER BY id LIMIT 1000 OFFSET 100000——OFFSET越往后越慢MySQL得扫过前10w行才能定位起点。正确做法是用上一批最后的id作为下一批起点变成游标式推进UPDATE users SET status 1 WHERE id 12345 AND id 13345 AND status 0;必须确保WHERE条件字段有索引比如id主键或statusid联合索引每次执行后记录最大id值下次用它当边界而不是靠计数器加AND status 0这类业务条件防止重复执行时误改已处理数据INSERT … SELECT 大量数据时关掉 autocommit 手动分段INSERT INTO t2 SELECT * FROM t1 WHERE ...看着简洁但整个SELECT结果集会一次性进事务锁表刷日志全来一遍。尤其t1有千万行时基本等于堵死整张表。 NameGPT名称生成器 免费AI公司名称生成器AI在线生成企业名称注册公司名称起名大全。