功能介绍
热点更新功能是一项针对高并发场景的优化能力,主要用于解决像秒杀、限时抢购这类业务中,大量请求同时更新同一条数据库记录(称为“热点行”)时导致的性能瓶颈问题。
当创建热点更新保护任务后,系统会自动探测是否有单行的热点更新,如果有,则会将这些存在热点行更新冲突的事务在逻辑上分为多个组(group),同一个组内的事务之间除了更新热点行语句,还会并行执行其他语句,这样可以减少大量行锁造成的并发性能下降,提高高并发场景的数据库性能。支持通过 DBbrain 控制台 创建、查看、关闭和删除热点更新保护任务。
该功能的核心工作原理可以简单理解为如下流程:
1. 自动探测:系统会实时监控数据库的更新操作,自动识别出被高频率更新的特定数据行。
2. 请求排队:一旦识别出热点行,系统会将后续针对该行的并发更新请求放入等待队列。
3. 事务等待唤醒:逻辑分组之后,组内事务只会在执行热点更新语句时要求串行,执行其他语句时为并行。
支持版本
内核版本 MySQL 5.7 20250330 及以上支持基于主键和唯一键的热点更新优化。
内核版本 MySQL 8.0 20241001 及以上支持基于主键的热点更新优化。
适用场景
该功能主要用于应对秒杀、限时抢购等业务场景,解决因大量用户同时更新同一条数据(如库存)导致的数据库性能瓶颈问题。
在事务原本执行时间比较长、或者有长短事务混合的场景中,使用该功能可以提升执行性能。
功能优势
无需业务改造。
具备更广泛的 SQL 兼容性,能够支持一个事务中多个 SELECT FOR UPDATE、UPDATE 或 INSERT 的 SQL。
原本需要在前一个事务提交后才能开始更新热点行的事务,现在只需要在前一个事务更新完后就能执行,大大缩短了事务等待锁的时间。
性能数据
实例规格配置:MySQL 8.0 独享型 - 32核256000MB,存储空间200GB。
开启热点更新功能后,云数据库 MySQL 的 TPS 能够稳定在3万左右,可以满足实际的业务需求。

功能使用注意事项
适用的事务模式如下所示,其中,a 不能是索引键,否则会失去效果。
BEGIN;xxxUPDATE table_name SET a=? WHERE id/pk=?;yyyCOMMIT;
唯一键热点更新使用方法是在 SQL 中加入 Hint:
/*+ TXSQL_UK_HOT_UPDATE */
,示例如下。UPDATE /*+ TXSQL_UK_HOT_UPDATE */ table_name SET a=? WHERE uk=?;
使用热点更新功能时,参数 thread_handling 的取值请设置为 one-thread-per-connection。
功能使用限制
负载限制
一个事务中不允许对同一个热点记录做多次 UPDATE。
事务 UPDATE 热点完之后,后面的语句不能有冲突,虽然不构成热点,但是可能会出现 hang 住的现象。
同一个事务内不能更新多个热点。
热点更新负载期间不能删除热点行。
参数限制
暂不支持线程池模式。
需要开启 Binlog,并且参数 binlog_order_commits = ON。如果关闭 Binlog,参数 innodb_hot_update_detect 则无法打开;如果开启了参数 innodb_hot_update_detect,且负载中仍有热点,则此时无法关闭 Binlog。
要关闭参数 innodb_hot_update_detect,必须等待当前负载中热点更新结束。
SELECT FOR UPDATE 限制
SELECT FOR UPDATE 和 UPDATE 都基于主键索引单条更新且更新条件一致。
SELECT FOR UPDATE 必须在 UPDATE 之前。
唯一键限制
不支持 SELECT UK FOR UPDATE 之后 UPDATE UK 的事务模式。
不支持同一个事务内先使用主键,再使用唯一键更新热点行这种事务模式。如果事务1使用主键,事务2使用唯一键更新同一行,这种混合更新方式是支持的。
功能使用方法
云数据库 MySQL 提供如下两种方法来开启热点更新功能。
方法一:通过 DBbrain 控制台开启
方法二:通过参数开启
通过设置参数 innodb_hot_update_detect 的值为 ON,来开启热点更新功能。
相关参数说明
参数名 | 动态 | 类型 | 默认 | 参数值范围 | 说明 |
innodb_hot_update_detect | yes | string | ON | ON/OFF | 是否开启热点更新功能。 ON:表示开启。 OFF:表示关闭。 |