PolarDB提供Inventory Hint,帮助您快速提交、回滚事务。您还可以将Inventory Hint和Statement Queue配合使用,有效提高业务的吞吐能力。

前提条件

PolarDB集群版本需为以下版本之一:
  • PolarDB MySQL版8.0版本且内核小版本需为8.0.1.1.1及以上。
  • PolarDB MySQL版5.7版本且内核小版本需为5.7.1.0.17及以上。
  • PolarDB MySQL版5.6版本。
您可以通过查询版本号确认集群版本。

背景信息

在电商秒杀活动等业务场景中,减少库存是一个常见的高并发、串行化的任务模型,PolarDB使用排队和事务性Hint来控制并发,并快速提交或回滚事务,来提高业务的吞吐能力。

注意事项

PolarDB MySQL版8.0版本的COMMIT_ON_SUCCESSROLLBACK_ON_FAIL语法不能运行在autocommit模式下。示例如下:
UPDATE /*+ ROLLBACK_ON_FAIL */ T
SET c = c - 1
WHERE id = 1
ERROR 7531 (HY000):Inventory transactinal hints didn't allowed in autocommit mode

语法

PolarDB提供的Inventory Hint支持SELECT、UPDATE、INSERT、DELETE语句。

Inventory Hint包括如下三个事务语法:

  • COMMIT_ON_SUCCESS:当前语句执行成功就提交事务。

    示例:

    • PolarDB MySQL版5.6版本
      UPDATE COMMIT_ON_SUCCESS T
      SET c = c - 1
      WHERE id = 1;
    • PolarDB MySQL版5.7和8.0版本
      UPDATE /*+ COMMIT_ON_SUCCESS */ T
      SET c = c - 1
      WHERE id = 1;
  • ROLLBACK_ON_FAIL:当前语句执行失败就回滚事务。

    示例:

    • PolarDB MySQL版5.6版本
      UPDATE ROLLBACK_ON_FAIL T
      SET c = c - 1
      WHERE id = 1;
    • PolarDB MySQL版5.7和8.0版本
      UPDATE /*+ ROLLBACK_ON_FAIL */ T
      SET c = c - 1
      WHERE id = 1;
  • TARGET_AFFECT_ROW number:如果当前语句影响的行数符合设定的行数则执行成功,否则语句执行失败。

    假设Target Affect Row的值设为1,如果更新语句实际更新到了一条数据则认为成功,如果更新没有命中任何记录则认为失败。

    示例:
    • PolarDB MySQL版5.6版本
      UPDATE TARGET_AFFECT_ROW 1  T
      SET c = c - 1
      WHERE id = 1;
      ERROR HY000: The affected row number does not match that of user specified.
    • PolarDB MySQL版5.7和8.0版本
      UPDATE /*+ TARGET_AFFECT_ROW(1) */ T
      SET c = c - 1
      WHERE id = 1;
      ERROR HY000: The affected row number does not match that of user specified.

配合Statement Queue使用

UPDATE、INSERT、DELETE语句中的COMMIT_ON_SUCCESSROLLBACK_ON_FAILTARGET_AFFECT_ROW number语法可以和Statement Queue配合使用。

PolarDB MySQL版5.6版本示例如下:
UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE id ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE 1 ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
PolarDB MySQL版5.7和8.0版本示例如下:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE('id') */ t
SET col1 = col1 + 1
WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE(1) */ t
SET col1 = col1 + 1
WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0