并发控制(Statement Concurrency Control)

更新时间:
复制为 MD 格式

数据库在面临突发流量、资源消耗过高的SQL或访问模型变化时,可能会导致性能下降甚至服务不可用。PolarDB-X标准版提供了并发控制(Concurrency Control,CCL)功能,允许您针对特定的SQL模式设置并发阈值,从而主动管理数据库负载,保障实例的持续稳定运行。

适用范围

实例版本为PolarDB-X标准版,引擎为MySQL 8.0。

功能简介

CCL功能通过匹配SQL语句的特征来识别并限制其并发执行数量。当一条SQL命中您设定的规则,且当前并发数已达到上限时,该SQL将进入等待队列,直到有执行资源被释放或等待超时。

CCL规则主要通过以下三个维度来匹配SQL:

  • SQL命令类型:如SELECTUPDATEINSERTDELETE

  • 操作对象:SQL操作的具体数据库(Schema)或表(Table)。

  • 关键字:SQL语句文本中包含的一个或多个关键字。

注意事项

  • 生效范围:CCL操作不产生日志,因此仅在当前实例生效,不会通过日志同步到备库、只读实例或灾备实例。

  • 死锁规避:为防止因DML持有事务锁而导致的死锁,进入等待队列的SQL会正常响应事务超时和KILL命令。

  • 规则优先级:CCL规则的优先级由其ID决定,ID越大,优先级越高。当一条SQL同时匹配多条规则时,将应用ID最大的那条规则。

配置系统参数

您可以通过修改以下全局参数来调整CCL的全局行为。

参数

说明

ccl_max_waiting_count

单条CCL规则下,允许处于等待状态的SQL最大数量。超过此限制后,SQL将执行失败并返回错误码ERROR 7534 (HY000): Concurrency control waiting count exceed max waiting count。默认为INT_MAX64,表示无限制。

说明
  • 存储节点版本为20251105及以上版本时,更新参数默认值为INT_MAX64,表示无限制。如果设置为0,则命中规则的SQL将立即执行失败,并返回错误码ERROR 7534

  • 存储节点版本为20251105以下版本时,参数默认值为0,表示无限制。

ccl_wait_timeout

等待队列中的SQL最长等待时间,超过此时长后,SQL将不再受CCL限制并继续执行。

  • 默认值:86400

  • 单位:秒。

操作指南

PolarDB-XCCL规则存储在系统表mysql.concurrency_control中,并提供了一个内置工具包DBMS_CCL,推荐您使用此工具包中的存储过程来管理规则。

管理CCL规则

您可以通过调用DBMS_CCL包中的存储过程来创建、删除和刷新规则。

存储过程

说明

dbms_ccl.add_ccl_rule('<Type>', '<Schema>', '<Table>', <Count>, '<Keywords>');

添加一条CCL规则。

  • Type:SQL命令类型。

  • Schema:匹配的数据库名。

  • Table:匹配的表名。

  • Count:并发数。

  • Keywords:匹配的关键字,多个关键字用分号(;)分隔。

dbms_ccl.add_ccl_rule_returning(...);

添加规则并返回其生成的ID,参数与add_ccl_rule相同。

说明

仅在存储节点版本为20251105及以上版本支持。

dbms_ccl.del_ccl_rule(<Id>);

根据ID删除一条CCL规则。

dbms_ccl.del_ccl_rule_batch('id1, id2, ...');

根据ID列表批量删除规则。

说明

仅在存储节点版本为20251105及以上版本支持。

dbms_ccl.del_all_ccl_rule();

删除所有CCL规则。

说明

仅在存储节点版本为20251105及以上版本支持。

dbms_ccl.flush_ccl_rule();

重新从系统表加载所有CCL规则到内存。如果您直接修改了mysql.concurrency_control表,需执行此命令使更改生效。

示例1:添加规则

-- 限制对test.sbtest1表的所有SELECT操作并发数为3
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');

-- 限制所有包含关键字'key1'的SELECT操作并发数为20
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');

示例2:删除规则

-- 删除ID为15的规则
CALL dbms_ccl.del_ccl_rule(15);

如果删除的规则不存在,系统会报相应的警告,您可以使用show warnings;查看警告内容。

show warnings;

+---------+------+---------------------------------------------------+
| Level   | Code | Message                                           |
+---------+------+---------------------------------------------------+
| Warning | 7536 | Concurrency control rule 15 is not found in table |
| Warning | 7536 | Concurrency control rule 15 is not found in cache |
+---------+------+---------------------------------------------------+

查看CCL规则状态

您可以使用show_ccl_rule()存储过程查看当前内存中生效的所有CCL规则及其运行状态。

CALL dbms_ccl.show_ccl_rule();

+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+
| ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | CONCURRENCY_PEEK | KILLED_NUM | KEYWORDS |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+
|    1 | SELECT | test   | sbtest1 | Y     | N     |                 3 |       0 |       0 |        0 |                0 |          0 |          |
|    2 | SELECT |        |         | Y     | N     |                20 |       0 |       0 |        0 |                0 |          0 | key1     |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+------------------+------------+----------+

输出列说明

列名

说明

ID

规则ID。

TYPE

SQL命令类型。

SCHEMA

匹配的数据库名。

TABLE

匹配的表名。

STATE

规则状态。

ORDER

关键字是否按顺序匹配。

CONCURRENCY_COUNT

设置的并发数阈值。

MATCHED

该规则自加载以来累计匹配到的SQL数量。

RUNNING

当前正在执行的、匹配该规则的SQL数量。

WAITING

当前正在等待执行的、匹配该规则的SQL数量。

CONCURRENCY_PEEK

历史并发峰值。

说明

仅在存储节点版本为20251105及以上版本支持。

KILLED_NUM

因等待超时或被KILL而终止的SQL数量。

说明

仅在存储节点版本为20251105及以上版本支持。

KEYWORDS

匹配的关键字,多个关键字用分号(;)分隔。