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_SUCCESS
和ROLLBACK_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;
- PolarDB MySQL版5.6版本
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;
- PolarDB MySQL版5.6版本
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.
- PolarDB MySQL版5.6版本
配合Statement Queue使用
UPDATE、INSERT、DELETE語句中的COMMIT_ON_SUCCESS
、ROLLBACK_ON_FAIL
和TARGET_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