Este tópico descreve o recurso inventory hint do AliSQL. Use esse recurso em conjunto com os recursos returning e statement queue para confirmar e reverter transações em alta velocidade e aumentar o throughput da sua aplicação.
Informações básicas
Em casos de uso como vendas relâmpago, a redução de estoque é uma tarefa comum que exige alta concorrência e processamento serializado. O AliSQL usa filas e hints transacionais para controlar a concorrência, o que permite confirmar ou reverter transações rapidamente e melhorar o throughput do negócio.
O recurso inventory hint aumenta o desempenho de uma instância do ApsaraDB RDS for MySQL para até 31.000 transações por segundo (TPS) durante a atualização de hot data em uma única linha de tabela. Para mais informações, consulte Método de teste e resultados de atualizações de hot data em uma única linha.
Pré-requisitos
A instância RDS deve executar uma das seguintes versões do MySQL:
MySQL 8.4
MySQL 8.0
MySQL 5.7
MySQL 5.6
Sintaxe
Os seguintes hints estão disponíveis para uso em instruções SELECT, UPDATE, INSERT e DELETE:
-
Para MySQL 5.7, 8,0 e 8,4:
-
Estão disponíveis os seguintes hints transacionais:
COMMIT_ON_SUCCESS: confirma a transação se a execução da instrução com este hint for bem-sucedida.
ROLLBACK_ON_FAIL: reverte a transação se a execução da instrução com este hint falhar.
Sintaxe:
/*+ COMMIT_ON_SUCCESS */ /*+ ROLLBACK_ON_FAIL */Exemplo:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ T SET c = c - 1 WHERE id = 1; -
O hint condicional TARGET_AFFECT_ROW(NUMBER) também está disponível.
Ao aplicar esse hint condicional à instrução atual, a execução só terá êxito se o número de linhas afetadas corresponder exatamente ao valor especificado no hint.
Sintaxe:
/*+ TARGET_AFFECT_ROW(NUMBER) */Exemplo:
UPDATE /*+ TARGET_AFFECT_ROW(1) */ T SET c = c - 1 WHERE id = 1;
-
-
MySQL 5.6
A sintaxe dos hints no MySQL 5.6 é semelhante à dos hints no MySQL 5.7 e MySQL 8.0. A única diferença é que não é necessário incluir os hints do MySQL 5.7 e MySQL 8.0 dentro de comentários.
Exemplo:
UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL T SET c = c - 1 WHERE id = 1; UPDATE TARGET_AFFECT_ROW(1) T SET c = c - 1 WHERE id = 1;
Observações de uso
Os hints devem ser seguidos pelos nomes das tabelas.
Quando um hint usado em uma transação entra em vigor, ele aciona uma confirmação automática da transação. Por isso, posicione o hint na última instrução SQL da transação.
-
Hints transacionais não oferecem suporte ao modo autocommit. Se você usar um hint transacional em uma instrução executada nesse modo, o sistema relatará um erro. Exemplo:
mysql> UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; ERROR 7531 (HY000): Inventory transactional hints didn't allowed in autocommit mode -
Não é possível usar hints transacionais em subinstruções. Caso utilize um hint transacional em uma subinstrução, o sistema relatará um erro. Exemplo:
mysql> CREATE TRIGGER tri_1 -> BEFORE INSERT ON t -> FOR EACH ROW -> BEGIN -> INSERT /*+ commit_on_success */ INTO t1 VALUES (1); -> end// mysql> INSERT INTO t VALUES (2, 1); ERROR HY000: Inventory transactional hints didn't alllowed in stored procedure -
Hints condicionais não são permitidos em instruções SELECT ou EXPLAIN. A utilização desses hints nessas instruções resulta em erro. Exemplo:
mysql> EXPLAIN UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; ERROR 7532 (HY000): Inventory conditional hints didn't match with resultNotaEspecifique um número inválido em TARGET_AFFECT_ROW e verifique se o sistema relata erros:
mysql> EXPLAIN UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(-1) */ t -> SET col1 = col1 + 1 -> WHERE id = 1; +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | 1 | UPDATE | t | NULL | range | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using where | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ 1 row in set, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1064 | Optimizer hint syntax error near '-1) */ t set col1=col1+1 where id =1' at line 1 | | Note | 1003 | update /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ `test`.`t` set `test`.`t`.`col1` = (`test`.`t`.`col1` + 1) where (`test`.`t`.`id` = 1) | +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Uso com o recurso returning
Combine o recurso inventory hint com o recurso returning para permitir que o sistema retorne conjuntos de resultados em tempo real. Para mais informações, consulte Returning. Exemplo:
mysql> CALL dbms_trans.returning("*", "update /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t
set col1=col1+1 where id=1");
+----+------+
| id | col1 |
+----+------+
| 1 | 13 |
+----+------+
1 row in set (0.00 sec)
mysql> CALL dbms_trans.returning("*", "insert /*+ commit_on_success rollback_on_fail target_affect_row(1) */ into
t values(10,10)");
+----+------+
| id | col1 |
+----+------+
| 10 | 10 |
+----+------+
1 row in set (0.01 sec)
Uso com o recurso statement queue
Utilize o recurso inventory hint junto com o recurso statement queue para que o sistema coloque as instruções em fila. Para mais informações, consulte Statement queue. Exemplo:
mysql> UPDATE /*+ ccl_queue_field(id) commit_on_success 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
mysql> UPDATE /*+ ccl_queue_value(1) commit_on_success 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