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;
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_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