PolarDB MySQL 5.7/8.0中Statement Queue和Inventory Hint结合使用案例及注意事项

概述

对于PolarDB MySQL高并发热点优化,PolarDB MySQL提供了结合Statement Queue和Inventory Hint的使用方式,使用过程中需要注意将对应的Inventory Hint通过DBMS_OUTLN.add_optimizer_outline加入到SQL语句中。本文主要以PolarDB MySQL 5.7/8.0为例进行说明和介绍注意事项。

详细信息

  1. 当您需要并发更新某个商品库存表时,可以结合Statement Queue和Inventory Hint一起使用。示例表结构如下所示。
    CREATE TABLE `t2` (
      `id` int(11) NOT NULL,
      `kucun` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2. 您需要按照以下SQL通过add_optimizer_outline加入Optimizer Hint,COMMIT_ON_SUCCESS需要在ccl_queue_filed前面。
    CALL DBMS_OUTLN.add_optimizer_outline ( 'jmdb07', '', 1, '/*+ COMMIT_ON_SUCCESS ccl_queue_filed("id") */', "UPDATE  t2 SET kucun = kucun - 1 WHERE id = 100 AND kucun > 0" ) 
    系统显示类似如下,说明创建成功。

    若ccl_queue_filed在前面,COMMIT_ON_SUCCESS在后面,会出现以下报错。

  3. 当添加好Optimizer Hint后,可以通过以下步骤进行验证:
    1. 开启一个事务,变更数据。
      begin;
      UPDATE /*+ COMMIT_ON_SUCCESS ccl_queue_filed("id") */ t2 SET kucun = kucun - 1 WHERE id = 100 AND kucun > 0
      说明:执行SQL语句时,需要添加Inventory Hint,否则添加的配置不会生效。
      系统显示类似如下。
    2. 此时事物未提交,新开一个会话,可以看到库存已经减1,说明COMMIT_ON_SUCCESS已经生效。
    3. 执行以下命令,查看是否命中添加的Statement Outline。
      call dbms_outln.show_outline();
      系统显示类似如下,说明已经命中。

相关文档

适用于

  • PolarDB MySQL云原生数据库