RDS PostgreSQL提供pg_concurrency_control插件,用于对SQL进行并发控制。

前提条件

RDS PostgreSQL实例版本为PostgreSQL 10或11。

参数说明

参数 默认值 说明
pg_concurrency_control.query_concurrency 0 设置Select类型SQL并发控制的排队个数限制。取值范围为0~1024,默认值为0,表示关闭Select类型SQL并发控制。
pg_concurrency_control.bigquery_concurrency 0 设置慢查询类型SQL并发控制的排队个数限制。取值范围为0~1024,默认值为0,表示关闭慢查询类型SQL并发控制。

您可以使用hint "/*+bigsql*/"的方式来指定一个请求为慢查询。例如:

/*+bigsql*/select * from test;

此时select * from test;被认为是一个慢查询。

pg_concurrency_control.transaction_concurrency 0 设置事务块并发控制的排队个数限制。取值范围为0~1024,默认值为0,表示关闭事务块并发控制。
pg_concurrency_control.autocommit_concurrency 0 设置DML类型SQL并发控制的排队个数限制。取值范围为0~1024,默认值为0,表示关闭DML类型SQL并发控制。
pg_concurrency_control.control_timeout 1秒 设置Select类型SQL、DML类型SQL和事务块的并发控制排队等待时间。最小值为30毫秒(ms),最大值为3秒(s)。
pg_concurrency_control.bigsql_control_timeout 1秒 设置慢查询并发控制排队等待时间。最小值为30毫秒(ms),最大值为3秒(s)。
pg_concurrency_control.timeout_action TCC_break 设置Select类型SQL、DML类型SQL和事务块的并发控制等待超时后的行为。取值:
  • TCC_break:跳过等待继续执行。
  • TCC_rollback:超时后报错,事务回滚。
  • TCC_wait:超时后重置时间戳继续等待。
pg_concurrency_control.bigsql_timeout_action TCC_wait 设置慢查询并发控制等待超时后的行为。取值:
  • TCC_break:跳过等待继续执行。
  • TCC_rollback:超时后报错,事务回滚。
  • TCC_wait:超时后重置时间戳继续等待。

使用方法

  1. 使用如下命令创建插件:
    create extension pg_concurrency_control;
  2. 设置并发控制排队个数限制大于0,即开启插件排队功能。

    例如设置pg_concurrency_control.query_concurrency=10,即开启Select类型SQL并发控制功能。其余功能开启方式类似。

使用示例

对自定义SQL操作进行并发控制。

  1. 使用如下命令查看排队视图:
    select * from pg_concurrency_control_status();

    系统输出类似如下结果:

     autocommit_count | bigquery_count | query_count | transaction_count 
    ------------------+----------------+-------------+-------------------
                    0 |              0 |           0 |                 0 
    (1 row)
  2. 设置pg_concurrency_control.query_concurrency大于0,例如10。
  3. 执行慢查询语句:
    /*+ bigsql */ select pg_sleep(10);
  4. 再次查看排队视图:
    select * from pg_concurrency_control_status();

    系统输出类似如下结果:

     autocommit_count | bigquery_count | query_count | transaction_count 
    ------------------+----------------+-------------+-------------------
                    0 |              1 |           0 |                 0 
    (1 row)
    说明 慢查询执行完毕后,排队信息会自动清空。