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