You need to enable JavaScript to run this app.
导航
热点高并发更新
最近更新时间:2025.02.28 15:27:02首次发布时间:2025.02.28 15:27:02

秒杀场景是实际业务中常见的一种业务场景,对于数据库而言,这个场景的特点就是大量并发针对同一行数据进行更新。热点数据更新的核心问题在于行锁的冲突,为了解决这个问题,云数据库 MySQL 版采用了相同热点行的更新批量执行的方式。对于带有热点更新标识的 SQL 进入数据库后,数据库会对更新相同数据的 SQL 进行合并处理,从而提升热点高并发更新的性能。

使用限制

  • 只支持单表更新操作。

  • 不支持表结构上带有触发器。

  • 不支持分区表。

  • 不支持带有 OFFSET/LIMIT/ORDER BYUPDATE 语句。

  • 查询必须带有WHERE条件,且为等值索引条件。

  • 在事务块中使用秒杀,秒杀语句必须是事务块中最后一条 SQL 。

  • UPDATE 列中不能包含主键和当前使用的索引列,除非 where 条件完全命中索引。

  • 云数据库 MySQL 版的 8.0.26 版本序列的实例暂不支持该功能。

使用说明

  • 用户使用 SQL HINT 的方式指定秒杀更新操作,HINT 关键字为 LOGIC_UPDATE

    update /*+ LOGIC_UPDATE */ t_stock set num = num - 1 where id = X and num > 0;
    

  • 上述的批量执行设计只能支持非事务块的热点更新操作。如果需要在事务中使用秒杀,需要增加 HINT 关键字 AUTO_LOGIC_COMMIT_ROLLBACK,而且需要把热点更新的 SQL 作为事务的最后一条 SQL。带了这个 HINT 以后,数据库会根据 UPDATE 是否成功来主动提交或者回滚事务。

    begin; 
    insert into t_order(userid, stockid, num) values(X, X, X); 
    update /*+ LOGIC_UPDATE AUTO_LOGIC_COMMIT_ROLLBACK */ t_stock set num = num - 1 where id = X and num > 0;
    commit;
    

性能测试

测试环境为 MySQL 5.7 版本,48C502GB 实例。

CREATE TABLE sbtest(id INT UNSIGNED NOT NULL AUTO_INCREMENT, c BIGINT UNSIGNED NOT NULL, PRIMARY KEY (id));

UPDATE /*+ LOGIC_UPDATE */ sbtest SET c=c-1 WHERE id = 1;

测试结果如下。可以看出在没有使用热点更新优化时,QPS 会随着并发加大而急剧下降;而打开优化后,QPS 可以保持稳定。

163264128256512102420484096
关闭秒杀tps8309.067708.746408.444006.421786.19606.19247.76243.04245.75
pct99/ms2.78ms5.03ms11.61ms36.68ms147.62ms863.30ms6464.70ms10195.54ms18021.98ms
打开秒杀tps13002.1525056.9039866.6064778.3094073.5085589.4879741.7776620.2475845.25
pct99/ms1.30ms1.37ms2.67ms3.03ms4.81ms11.03ms23.26ms42.14ms74.00ms