全部產品
Search
文件中心

PolarDB:Inventory Hint

更新時間:Jul 06, 2024

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