group,group 内 leader 负责加锁,其余 follower 无需等待锁释放即可执行热点更新,事务内的其他语句可与其他事务并发执行。这一机制大幅提升了热点行更新的并行度,在半同步复制、高网络延迟等高事务延迟场景中效果尤为显著。group 将一组事务进行逻辑合并,从而提高并行度。并发事务 ──▶ Group 1 ──▶ Group 2 ──▶ Group 3 ──▶ ...│ │Leader LeaderFollower×N Follower×N
角色 | 行为 |
leader | 负责对热点行加锁和解锁,事务结束时释放锁并唤醒下一个 leader。 |
follower | 无需等待锁释放,在 leader 完成热点行更新后即可执行,事务内其他语句与其他事务并发执行。 |
group,第一个进入的事务成为 leader,其余为 follower。leader 加锁并执行热点行更新。leader 完成热点行更新后,立即 grant 下一个 follower 执行,无需等待 leader 提交。follower 被唤醒后,重新读取当前最新数据,直接执行热点行更新(跳过加锁步骤)。leader 在事务结束时释放行锁,唤醒下一个 leader,新的 group 随之形成。group 内的 follower 不再等待 leader 提交,事务等待锁的时间大幅缩短,在高延迟场景中提升效果尤为显著。group 内所有事务必须按照热点行更新的顺序依次提交,以保证 MVCC(多版本并发控制) 数据可见性和数据正确性。group 内某个事务需要回滚,则其后续所有已执行的事务都必须逆序回滚。
并发线程数 | 关闭热点更新 | 开启热点更新 | 加速比 |
8 | 671.15 | 668.64 | 1.0× |
32 | 660.69 | 6,927.31 | 10.5× |
128 | 635.14 | 15,304.53 | 24.1× |
512 | 594.28 | 13,709.24 | 23.1× |
1024 | 551.57 | 12,936.15 | 23.5× |

并发线程数 | 关闭热点更新 | 开启热点更新 | 延迟降低 |
8 | 12.08 | 12.08 | 1.0× |
32 | 49.21 | 5.18 | 9.5× |
128 | 204.11 | 9.56 | 21.4× |
512 | 877.61 | 37.56 | 23.4× |
1024 | 1903.57 | 77.19 | 24.7× |
参数名 | 默认值 | 说明 |
innodb_hot_update_detect | OFF | 是否开启热点更新探测。开启后,系统自动识别热点行并触发合并优化。 |
innodb_hot_update_threshold | 30 | 触发热点更新合并优化的并发阈值。当对同一行的并发更新数超过该阈值时,触发热点更新机制。 |
限制项 | 说明 |
仅支持主键索引单条更新 | SELECT FOR UPDATE 和 UPDATE 均须基于主键索引单条操作,且更新条件必须一致。若 SELECT FOR UPDATE 在二级索引上加锁,热点优化不生效。 |
SELECT FOR UPDATE 必须在 UPDATE 之前 | 若事务中同时包含 SELECT FOR UPDATE 和 UPDATE 热点行,SELECT FOR UPDATE 必须先执行。UPDATE 到来时,若已排过队则跳过排队直接执行。 |
一个事务中不允许对同一热点行多次 UPDATE | 第一次 UPDATE 完成后,锁已释放给下一个事务,若再次 UPDATE 同一行,提交顺序会错乱,系统将报错并回滚整个事务。 |
热点行 UPDATE 后不允许有冲突 SQL | 事务更新热点行之后,后续语句不能与其他热点更新事务产生锁冲突,否则报错并回滚整个事务。 |
热点更新期间不允许删除热点记录 | 若有 DELETE 请求操作正在被热点更新的记录,将报错并回滚整个事务。 |
热点更新期间不允许通过二级索引更新热点记录 | 若通过二级索引更新正在被热点更新的记录,将报错并回滚整个事务。 |
暂不支持线程池模式 | 在开启线程池(Thread Pool)的实例上,热点更新功能暂不可用。 |
SHOW VARIABLES LIKE 'innodb_hot_update%';
BEGIN;UPDATE account SET balance = balance - 100 WHERE id = 1; -- 热点行,基于主键单条更新-- 其他非冲突业务逻辑...COMMIT;
BEGIN;SELECT * FROM account WHERE id = 1 FOR UPDATE; -- 基于主键,进入热点等待队列INSERT INTO account_log (account_id, amount, op_time) VALUES (1, -100, NOW()); -- 记录操作日志UPDATE account SET balance = balance - 100 WHERE id = 1; -- 热点行 UPDATE,触发 grant 下一个 followerCOMMIT;
SELECT FOR UPDATE 和 UPDATE 的 WHERE 条件必须一致,均须基于主键单条操作。select * from information_schema.INNODB_HOT_ROW_UPDATE_STATS 命令,或监控指标观察热点行相关统计信息,或通过 TPS/延迟指标的显著提升来确认功能生效。KILL 相关事务。group”的机制优化了此问题,但如遇延迟偏高,可适当调整 innodb_hot_update_wakeup_timeout 参数。文档反馈